Skip to content

Commit deba032

Browse files
committed
Fix file and image
add coroutines
1 parent 6749101 commit deba032

File tree

32 files changed

+537
-194
lines changed

32 files changed

+537
-194
lines changed
137 Bytes
Binary file not shown.

.idea/gradle.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ android {
2323
dependencies {
2424
implementation fileTree(dir: 'libs', include: ['*.jar'])
2525
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
26+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${kotlinCorutines_version}"
27+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${kotlinCorutines_version}"
28+
2629
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
2730

2831
api project(':omegatypes')

app/src/main/java/omega_r/com/omegatypesexample/MainActivity.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package omega_r.com.omegatypesexample
22

33

4+
import android.graphics.Bitmap
5+
import android.graphics.BitmapFactory
6+
import android.graphics.drawable.BitmapDrawable
47
import android.os.Bundle
58
import android.widget.ImageView
69
import android.widget.TextView
710
import androidx.core.content.res.ResourcesCompat
811
import com.omega_r.libs.omegatypes.Color
912
import com.omega_r.libs.omegatypes.Text
1013
import com.omega_r.libs.omegatypes.TextStyle
14+
import com.omega_r.libs.omegatypes.file.File
15+
import com.omega_r.libs.omegatypes.file.from
1116
import com.omega_r.libs.omegatypes.image.*
1217
import com.omega_r.libs.omegatypes.join
18+
import kotlinx.coroutines.Dispatchers
19+
import kotlinx.coroutines.launch
20+
import kotlinx.coroutines.withContext
21+
import java.io.ByteArrayOutputStream
1322

1423

1524
class MainActivity : BaseActivity() {
@@ -45,8 +54,29 @@ class MainActivity : BaseActivity() {
4554

4655
title = list.join(",", postfix = ".").getCharSequence(this)
4756

48-
val image = Image.from("https://dejagerart.com/wp-content/uploads/2018/09/Test-Logo-Circle-black-transparent.png")
4957

58+
val image = intent.getSerializableExtra("test") as? Image ?: run {
59+
60+
val image = Image.from("https://dejagerart.com/wp-content/uploads/2018/09/Test-Logo-Circle-black-transparent.png")
61+
62+
ImageProcessors.current.launch {
63+
val stream = image.getStream(this@MainActivity, Bitmap.CompressFormat.PNG)
64+
val bitmap = BitmapFactory.decodeStream(stream)
65+
66+
val bitmapImage = Image.from(BitmapDrawable(this@MainActivity.resources, bitmap))
67+
68+
withContext(Dispatchers.Main) {
69+
imageView.setImage(bitmapImage)
70+
71+
72+
intent.putExtra("test", bitmapImage)
73+
finish()
74+
startActivity(intent)
75+
// imageView.setImageBitmap(bitmap)
76+
}
77+
}
78+
image
79+
}
5080

5181
imageView.setImage(image)
5282

app/src/main/res/layout/activity_main.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,9 @@
2424
android:background="@color/colorAccent"
2525
tools:src="@mipmap/ic_launcher"/>
2626

27+
<Button
28+
android:layout_width="wrap_content"
29+
android:layout_height="wrap_content"
30+
android:text="Test"/>
31+
2732
</RelativeLayout>

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
buildscript {
44
ext.kotlin_version = '1.3.41'
5-
ext.kotlin_version = '1.3.30'
5+
ext.kotlinCorutines_version = '1.2.1'
66
ext.supportVersion = '28.0.0'
77
ext.compileSdkVersion = 28
88
ext.targetSdkVersion = 28

glide/src/main/java/com/omega_r/libs/omegatypes/image/GlideImagesProcessor.kt

Lines changed: 44 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,19 @@ import android.view.View
77
import android.widget.ImageView
88
import com.bumptech.glide.Glide
99
import com.bumptech.glide.RequestBuilder
10-
import com.bumptech.glide.RequestManager
11-
import com.bumptech.glide.request.target.CustomTarget
1210
import com.bumptech.glide.request.target.CustomViewTarget
1311
import com.bumptech.glide.request.transition.Transition
14-
import com.omega_r.libs.omegatypes.glide.WrapperInputStream
12+
import com.omega_r.libs.omegatypes.image.Image.Companion.NO_PLACEHOLDER_RES
1513
import java.io.InputStream
1614
import kotlin.reflect.KClass
1715

1816
/**
1917
* Created by Anton Knyazev on 2019-10-03.
2018
*/
2119
class GlideImagesProcessor(
22-
private val oldImagesProcessor: ImagesProcessor,
20+
private val oldImagesProcessor: ImageProcessors,
2321
vararg excludeImageClasses: KClass<out Image>
24-
) : ImagesProcessor() {
22+
) : ImageProcessors() {
2523

2624
companion object {
2725

@@ -33,14 +31,14 @@ class GlideImagesProcessor(
3331

3432
private val excludeImageClasses = listOf(*excludeImageClasses)
3533

36-
private fun RequestManager.createRequestBuilder(image: Image): RequestBuilder<Drawable>? {
34+
private fun <T> RequestBuilder<T>.createRequestBuilder(image: Image): RequestBuilder<T>? {
3735
if (excludeImageClasses.contains(image::class)) {
3836
return null
3937
}
4038
return when (image) {
4139
is UrlImage -> load(image.url)
4240
is UriImage -> load(image.uri)
43-
is FileImage -> load(image.file)
41+
is JavaFileImage -> load(image.file)
4442
is ResourceImage -> load(image.resId)
4543
is BitmapImage -> load(image.bitmap)
4644
is DrawableImage -> load(image.drawable)
@@ -51,77 +49,66 @@ class GlideImagesProcessor(
5149

5250
override fun Image.applyImage(imageView: ImageView, placeholderResId: Int) {
5351
Glide.with(imageView)
52+
.asDrawable()
5453
.createRequestBuilder(this)
55-
?.apply {
56-
if (placeholderResId != Image.NO_PLACEHOLDER_RES) placeholder(placeholderResId)
57-
into(imageView)
58-
} ?: with(oldImagesProcessor) {
59-
applyImage(imageView, placeholderResId)
60-
}
54+
?.applyPlaceholder(placeholderResId)
55+
?.into(imageView)
56+
?: applyOld { applyImage(imageView, placeholderResId) }
6157
}
6258

6359
override fun Image.applyBackground(view: View, placeholderResId: Int) {
6460
Image.Processor.applyEmptyBackground(view, placeholderResId)
6561
Glide.with(view)
62+
.asDrawable()
6663
.createRequestBuilder(this)
67-
?.apply {
68-
69-
if (placeholderResId != Image.NO_PLACEHOLDER_RES) placeholder(placeholderResId)
64+
?.applyPlaceholder(placeholderResId)
65+
?.into(object : CustomViewTarget<View, Drawable>(view) {
7066

71-
into(object : CustomViewTarget<View, Drawable>(view) {
72-
override fun onLoadFailed(errorDrawable: Drawable?) {
73-
Image.Processor.applyBackground(view, errorDrawable)
74-
}
67+
override fun onLoadFailed(errorDrawable: Drawable?) {
68+
Image.Processor.applyBackground(view, errorDrawable)
69+
}
7570

76-
override fun onResourceCleared(placeholder: Drawable?) {
77-
Image.Processor.applyBackground(view, placeholder)
78-
}
71+
override fun onResourceCleared(placeholder: Drawable?) {
72+
Image.Processor.applyBackground(view, placeholder)
73+
}
7974

80-
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
81-
Image.Processor.applyBackground(view, resource)
82-
}
75+
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
76+
Image.Processor.applyBackground(view, resource)
77+
}
8378

84-
})
85-
86-
} ?: with(oldImagesProcessor) {
87-
applyBackground(view, placeholderResId)
88-
}
79+
})
80+
?: applyOld { applyBackground(view, placeholderResId) }
8981
}
9082

91-
override fun Image.getStream(context: Context, compressFormat: Bitmap.CompressFormat, quality: Int): InputStream {
83+
override suspend fun Image.getStream(context: Context, compressFormat: Bitmap.CompressFormat, quality: Int): InputStream {
9284
return Glide.with(context)
85+
.asBitmap()
9386
.createRequestBuilder(this)
9487
?.run {
95-
val stream = WrapperInputStream()
96-
97-
into(object : CustomTarget<Drawable>() {
98-
override fun onLoadCleared(placeholder: Drawable?) {
99-
// nothing
100-
}
101-
102-
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
103-
stream.inputStream = Image.Processor.toBitmap(resource) {
104-
toInputStream(compressFormat, quality)
105-
}
106-
}
107-
108-
})
109-
stream
110-
111-
} ?: with(oldImagesProcessor) {
112-
getStream(context, compressFormat, quality)
113-
}
114-
88+
val futureTarget = submit()
89+
try {
90+
val bitmap = futureTarget.get()
91+
bitmap.toInputStream(compressFormat, quality)
92+
} finally {
93+
Glide.with(context)
94+
.clear(futureTarget)
95+
}
96+
} ?: applyOld { getStream(context, compressFormat, quality) }
11597
}
11698

11799
override fun Image.preload(context: Context) {
118100
Glide.with(context)
101+
.asDrawable()
119102
.createRequestBuilder(this)
120-
?.apply {
121-
preload()
122-
} ?: with(oldImagesProcessor) {
123-
preload(context)
124-
}
103+
?.preload()
104+
?: applyOld { preload(context) }
125105
}
126106

107+
private fun <T> RequestBuilder<T>.applyPlaceholder(placeholderResId: Int): RequestBuilder<T> {
108+
return if (placeholderResId != NO_PLACEHOLDER_RES) placeholder(placeholderResId) else this
109+
}
110+
111+
private inline fun <R> applyOld(block: ImageProcessors.() -> R): R {
112+
return block(oldImagesProcessor)
113+
}
127114
}

omegatypes/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ android {
2828
dependencies {
2929
implementation fileTree(dir: 'libs', include: ['*.jar'])
3030
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
31+
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:${kotlinCorutines_version}"
32+
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:${kotlinCorutines_version}"
3133
}

omegatypes/src/main/java/com/omega_r/libs/omegatypes/file/File.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.omega_r.libs.omegatypes.file
22

3+
import android.content.Context
34
import java.io.InputStream
45
import java.io.OutputStream
56
import java.io.Serializable
@@ -10,7 +11,7 @@ import java.io.Serializable
1011
interface File : Serializable {
1112

1213
companion object {
13-
14+
// for add extensions
1415
}
1516

1617
val name: String
@@ -49,17 +50,17 @@ interface File : Serializable {
4950
}
5051
}
5152

52-
suspend fun getMode(file: F): List<Mode>
53+
suspend fun getMode(context: Context, file: F): List<Mode>
5354

54-
suspend fun createInputStream(file: F): InputStream?
55+
suspend fun createInputStream(context: Context, file: F): InputStream?
5556

56-
suspend fun createOutputStream(file: F, append: Boolean = false): OutputStream?
57+
suspend fun createOutputStream(context: Context, file: F, append: Boolean = false): OutputStream?
5758

58-
suspend fun isExists(file: F): Boolean
59+
suspend fun isExists(context: Context, file: F): Boolean
5960

60-
suspend fun getFiles(file: F): List<F>?
61+
suspend fun getFiles(context: Context, file: F): List<F>?
6162

62-
suspend fun getRootFiles(): List<F>?
63+
suspend fun getRootFiles(context: Context): List<F>?
6364

6465
}
6566

omegatypes/src/main/java/com/omega_r/libs/omegatypes/file/FileSystems.kt

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.omega_r.libs.omegatypes.file
22

3+
import android.content.Context
34
import java.io.InputStream
45
import java.io.OutputStream
56
import kotlin.reflect.KClass
@@ -17,17 +18,17 @@ interface FileSystems {
1718

1819
}
1920

20-
suspend fun getMode(file: File): List<File.Mode>
21+
suspend fun getMode(context: Context, file: File): List<File.Mode>
2122

22-
suspend fun createInputStream(file: File): InputStream?
23+
suspend fun createInputStream(context: Context, file: File): InputStream?
2324

24-
suspend fun createOutputStream(file: File, append: Boolean): OutputStream?
25+
suspend fun createOutputStream(context: Context, file: File, append: Boolean): OutputStream?
2526

26-
suspend fun isExists(file: File): Boolean
27+
suspend fun isExists(context: Context, file: File): Boolean
2728

28-
suspend fun getFiles(file: File): List<File>?
29+
suspend fun getFiles(context: Context, file: File): List<File>?
2930

30-
suspend fun getRootFiles(fileClass: KClass<File>): List<File>?
31+
suspend fun getRootFiles(context: Context, fileClass: KClass<File>): List<File>?
3132

3233
class Default : FileSystems {
3334

@@ -37,33 +38,32 @@ interface FileSystems {
3738
map[fileClass] = fileSystem
3839
}
3940

40-
override suspend fun getMode(file: File): List<File.Mode> {
41-
return file.getFileSystem().getMode(file)
41+
override suspend fun getMode(context: Context, file: File): List<File.Mode> {
42+
return file.system.getMode(context, file)
4243
}
4344

44-
override suspend fun createInputStream(file: File): InputStream? {
45-
return file.getFileSystem().createInputStream(file)
45+
override suspend fun createInputStream(context: Context, file: File): InputStream? {
46+
return file.system.createInputStream(context, file)
4647
}
4748

48-
override suspend fun createOutputStream(file: File, append: Boolean): OutputStream? {
49-
return file.getFileSystem().createOutputStream(file, append)
49+
override suspend fun createOutputStream(context: Context, file: File, append: Boolean): OutputStream? {
50+
return file.system.createOutputStream(context, file, append)
5051
}
5152

52-
override suspend fun isExists(file: File): Boolean {
53-
return file.getFileSystem().isExists(file)
53+
override suspend fun isExists(context: Context, file: File): Boolean {
54+
return file.system.isExists(context, file)
5455
}
5556

56-
override suspend fun getFiles(file: File): List<File>? {
57-
return file.getFileSystem().getFiles(file)
57+
override suspend fun getFiles(context: Context, file: File): List<File>? {
58+
return file.system.getFiles(context, file)
5859
}
5960

60-
override suspend fun getRootFiles(fileClass: KClass<File>): List<File>? {
61-
return getFileSystem(fileClass).getRootFiles()
61+
override suspend fun getRootFiles(context: Context, fileClass: KClass<File>): List<File>? {
62+
return getFileSystem(fileClass).getRootFiles(context)
6263
}
6364

64-
private fun File.getFileSystem(): File.System<File> {
65-
return getFileSystem(this::class)
66-
}
65+
private val File.system: File.System<File>
66+
get() = getFileSystem(this::class)
6767

6868
private fun getFileSystem(fileClass: KClass<out File>): File.System<File> {
6969
@Suppress("UNCHECKED_CAST")

0 commit comments

Comments
 (0)