diff options
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/viewmodel/ConfigProxy.kt')
-rw-r--r-- | ui/src/main/java/com/wireguard/android/viewmodel/ConfigProxy.kt | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/ui/src/main/java/com/wireguard/android/viewmodel/ConfigProxy.kt b/ui/src/main/java/com/wireguard/android/viewmodel/ConfigProxy.kt new file mode 100644 index 00000000..c73b1efc --- /dev/null +++ b/ui/src/main/java/com/wireguard/android/viewmodel/ConfigProxy.kt @@ -0,0 +1,86 @@ +/* + * Copyright © 2017-2023 WireGuard LLC. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package com.wireguard.android.viewmodel + +import android.os.Build +import android.os.Parcel +import android.os.Parcelable +import androidx.core.os.ParcelCompat +import androidx.databinding.ObservableArrayList +import androidx.databinding.ObservableList +import com.wireguard.config.BadConfigException +import com.wireguard.config.Config +import com.wireguard.config.Peer + +class ConfigProxy : Parcelable { + val `interface`: InterfaceProxy + val peers: ObservableList<PeerProxy> = ObservableArrayList() + + private constructor(parcel: Parcel) { + `interface` = ParcelCompat.readParcelable(parcel, InterfaceProxy::class.java.classLoader, InterfaceProxy::class.java) ?: InterfaceProxy() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ParcelCompat.readParcelableList(parcel, peers, PeerProxy::class.java.classLoader, PeerProxy::class.java) + } else { + parcel.readTypedList(peers, PeerProxy.CREATOR) + } + peers.forEach { it.bind(this) } + } + + constructor(other: Config) { + `interface` = InterfaceProxy(other.getInterface()) + other.peers.forEach { + val proxy = PeerProxy(it) + peers.add(proxy) + proxy.bind(this) + } + } + + constructor() { + `interface` = InterfaceProxy() + } + + fun addPeer(): PeerProxy { + val proxy = PeerProxy() + peers.add(proxy) + proxy.bind(this) + return proxy + } + + override fun describeContents() = 0 + + @Throws(BadConfigException::class) + fun resolve(): Config { + val resolvedPeers: MutableCollection<Peer> = ArrayList() + peers.forEach { resolvedPeers.add(it.resolve()) } + return Config.Builder() + .setInterface(`interface`.resolve()) + .addPeers(resolvedPeers) + .build() + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeParcelable(`interface`, flags) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + dest.writeParcelableList(peers, flags) + } else { + dest.writeTypedList(peers) + } + } + + private class ConfigProxyCreator : Parcelable.Creator<ConfigProxy> { + override fun createFromParcel(parcel: Parcel): ConfigProxy { + return ConfigProxy(parcel) + } + + override fun newArray(size: Int): Array<ConfigProxy?> { + return arrayOfNulls(size) + } + } + + companion object { + @JvmField + val CREATOR: Parcelable.Creator<ConfigProxy> = ConfigProxyCreator() + } +} |