use serializable for parcelable
This commit is contained in:
4 files changed
+67
-2
No files matched your search
@@ -9,6 +9,7 @@ import java.io.DataOutputStream
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
|
||||
@Suppress("SameParameterValue")
|
||||
abstract class BaseClash(private val controllerPath: File) {
|
||||
protected fun <R> runControl(
|
||||
command: Int,
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.github.kr328.clash.core.serialization
|
||||
|
||||
import android.os.Parcel
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.modules.EmptyModule
|
||||
|
||||
object Parcels : AbstractSerialFormat(EmptyModule) {
|
||||
fun <T> dump(serializer: SerializationStrategy<T>, obj: T, parcel: Parcel) {
|
||||
serializer.serialize(ParcelsEncoder(parcel), obj)
|
||||
}
|
||||
|
||||
fun <T> load(deserializer: DeserializationStrategy<T>, parcel: Parcel): T {
|
||||
return deserializer.deserialize(ParcelsDecoder(parcel))
|
||||
}
|
||||
|
||||
private class ParcelsEncoder(private val parcel: Parcel) :
|
||||
ElementValueEncoder() {
|
||||
override fun encodeValue(value: Any) {
|
||||
parcel.writeValue(value)
|
||||
}
|
||||
override fun encodeNull() {
|
||||
parcel.writeValue(null)
|
||||
}
|
||||
}
|
||||
|
||||
class ParcelsDecoder(private val parcel: Parcel) : ElementValueDecoder() {
|
||||
private var nextObject: Any? = null
|
||||
|
||||
override fun decodeNotNullMark(): Boolean {
|
||||
nextObject = parcel.readValue(Parcels::class.java.classLoader)
|
||||
|
||||
return nextObject != null
|
||||
}
|
||||
|
||||
override fun decodeNull(): Nothing? = null
|
||||
|
||||
override fun decodeValue(): Any {
|
||||
return nextObject ?: throw NullPointerException("Parcel read data null")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,30 @@
|
||||
package com.github.kr328.clash.core.transact
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
import com.github.kr328.clash.core.serialization.Parcels
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class Proxy(val type: String) {
|
||||
data class Proxy(val type: String): Parcelable {
|
||||
@Serializable
|
||||
data class Packet(val proxies: Map<String, Proxy>)
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
Parcels.dump(serializer(), this, parcel)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<Proxy> {
|
||||
override fun createFromParcel(parcel: Parcel): Proxy {
|
||||
return Parcels.load(serializer(), parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<Proxy?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,5 +3,7 @@ package com.github.kr328.clash.service;
|
||||
import com.github.kr328.clash.core.ClashProcessStatus;
|
||||
|
||||
interface IClashObserver {
|
||||
void onStatusChanged(in ClashProcessStatus status);
|
||||
void onProxyChanged();
|
||||
void onNewLog();
|
||||
void onProcessStatusChanged(in ClashProcessStatus status);
|
||||
}
|
||||
Reference in new issue
Block a user