1 package com.android.systemui.util
2 
3 import java.lang.ref.SoftReference
4 import java.lang.ref.WeakReference
5 import kotlin.properties.ReadWriteProperty
6 import kotlin.reflect.KProperty
7 
8 /**
9  * Creates a Kotlin idiomatic weak reference.
10  *
11  * Usage:
12  * ```
13  * var weakReferenceObj: Object? by weakReference(null)
14  * weakReferenceObj = Object()
15  * ```
16  */
17 fun <T> weakReference(obj: T? = null): ReadWriteProperty<Any?, T?> {
18     return object : ReadWriteProperty<Any?, T?> {
19         var weakRef = WeakReference<T?>(obj)
20         override fun getValue(thisRef: Any?, property: KProperty<*>): T? {
21             return weakRef.get()
22         }
23 
24         override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
25             weakRef = WeakReference(value)
26         }
27     }
28 }
29 
30 /**
31  * Creates a Kotlin idiomatic soft reference.
32  *
33  * Usage:
34  * ```
35  * var softReferenceObj: Object? by softReference(null)
36  * softReferenceObj = Object()
37  * ```
38  */
39 fun <T> softReference(obj: T? = null): ReadWriteProperty<Any?, T?> {
40     return object : ReadWriteProperty<Any?, T?> {
41         var softRef = SoftReference<T?>(obj)
42         override fun getValue(thisRef: Any?, property: KProperty<*>): T? {
43             return softRef.get()
44         }
45 
46         override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
47             softRef = SoftReference(value)
48         }
49     }
50 }
51