diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt index 388691cea9255c689c428d7d1641a172f439f0d3..066856f2c6eb5f7432b49e5a00015ba2cbd8fc80 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt @@ -11,25 +11,25 @@ import android.view.ViewGroup import android.widget.TextView import butterknife.BindView import butterknife.ButterKnife -import de.kuschku.libquassel.protocol.BufferId +import de.kuschku.libquassel.quassel.BufferInfo class BufferListAdapter( lifecycleOwner: LifecycleOwner, - liveData: LiveData<List<BufferId>?>, + liveData: LiveData<List<BufferInfo>?>, runInBackground: (() -> Unit) -> Any, runOnUiThread: (Runnable) -> Any ) : RecyclerView.Adapter<BufferListAdapter.BufferViewHolder>() { - var data = mutableListOf<BufferId>() + var data = mutableListOf<BufferInfo>() init { - liveData.observe(lifecycleOwner, Observer { list: List<BufferId>? -> + liveData.observe(lifecycleOwner, Observer { list: List<BufferInfo>? -> runInBackground { val old = data val new = list ?: emptyList() val result = DiffUtil.calculateDiff( object : DiffUtil.Callback() { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) - = old[oldItemPosition] == new[newItemPosition] + = old[oldItemPosition].bufferId == new[newItemPosition].bufferId override fun getOldListSize() = old.size override fun getNewListSize() = new.size @@ -64,8 +64,8 @@ class BufferListAdapter( ButterKnife.bind(this, itemView) } - fun bind(bufferId: BufferId) { - text.text = "$bufferId" + fun bind(info: BufferInfo) { + text.text = "${info.networkId}/${info.bufferName}" } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt similarity index 83% rename from app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt rename to app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt index d128a9486337a97815466df9e729b5587d99f6a5..379f24890e6a7e3a687bea6a828135324a125b71 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt @@ -10,8 +10,10 @@ import android.view.ViewGroup import android.widget.AdapterView import butterknife.BindView import butterknife.ButterKnife +import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.libquassel.quassel.syncables.BufferViewConfig import de.kuschku.libquassel.quassel.syncables.BufferViewManager +import de.kuschku.libquassel.quassel.syncables.Network import de.kuschku.libquassel.session.Backend import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.SessionManager @@ -19,10 +21,11 @@ import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread import de.kuschku.quasseldroid_ng.util.helper.map import de.kuschku.quasseldroid_ng.util.helper.or +import de.kuschku.quasseldroid_ng.util.helper.switchMap import de.kuschku.quasseldroid_ng.util.helper.switchMapRx import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment -class ChatListFragment : ServiceBoundFragment() { +class BufferViewConfigFragment : ServiceBoundFragment() { private val handlerThread = AndroidHandlerThread("ChatList") @BindView(R.id.chatListToolbar) @@ -38,6 +41,8 @@ class ChatListFragment : ServiceBoundFragment() { = backend.map(Backend::sessionManager) private val bufferViewManager: LiveData<BufferViewManager?> = sessionManager.switchMapRx(SessionManager::session).map(ISession::bufferViewManager) + private val networks: LiveData<Map<NetworkId, Network>?> + = sessionManager.switchMapRx(SessionManager::session).map(ISession::networks) private val bufferViewConfigs = bufferViewManager.switchMapRx { manager -> manager.live_bufferViewConfigs.map { ids -> ids.mapNotNull { id -> @@ -62,7 +67,15 @@ class ChatListFragment : ServiceBoundFragment() { private val adapter = BufferViewConfigAdapter(this, bufferViewConfigs) - private val bufferList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers) + private val bufferIdList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers) + + private val bufferList = sessionManager.switchMap { manager -> + bufferIdList.map { ids -> + ids.mapNotNull { + manager.bufferSyncer?.bufferInfo(it) + } + } + } override fun onCreate(savedInstanceState: Bundle?) { handlerThread.onCreate() diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt deleted file mode 100644 index 9bd77701a8d8e8703de860fd2bede8b2e3da2b52..0000000000000000000000000000000000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt +++ /dev/null @@ -1,3 +0,0 @@ -package de.kuschku.quasseldroid_ng.ui.chat - -class ChatDelegate diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt index 1d68c90a2b4e233318ee45eb64145bd84897b4d2..8e48236f1e79d00dec7bcc7790205bc4f85223bc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt @@ -28,10 +28,6 @@ class AccountAdapter : } } - init { - setHasStableIds(true) - } - private val actionListener = object : ItemListener { override fun onAction(id: Long, pos: Int) { for (actionListener in actionListeners) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0c505022b8b5aca928d6c2617ec12b1fac38a367..98d830b5d6c2f36d196f9b667617a022379a5441 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -100,7 +100,7 @@ <fragment android:id="@+id/chatListFragment" - android:name="de.kuschku.quasseldroid_ng.ui.chat.ChatListFragment" + android:name="de.kuschku.quasseldroid_ng.ui.chat.BufferViewConfigFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </de.kuschku.quasseldroid_ng.util.ui.NavigationDrawerLayout> diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt index 83cca0a1a085cc7a5ffa6b8e029fa0e8d53a58a4..dea8e0f27094b10689f0a26e9517c90babe243bf 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt @@ -2,6 +2,7 @@ package de.kuschku.libquassel.quassel.syncables import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.protocol.Type +import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferSyncer import de.kuschku.libquassel.session.SignalProxy @@ -75,6 +76,11 @@ class BufferSyncer constructor( } } + fun initSetBufferInfos(infos: QVariantList?) { + _bufferInfos.clear() + infos?.mapNotNull { it.value<BufferInfo>() }?.forEach { _bufferInfos[it.bufferId] = it } + } + override fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) { _lastSeenMsg.remove(buffer2) _markerLines.remove(buffer2) @@ -85,11 +91,17 @@ class BufferSyncer constructor( _lastSeenMsg.remove(buffer) _markerLines.remove(buffer) _bufferActivities.remove(buffer) + _bufferInfos.remove(buffer) } override fun renameBuffer(buffer: BufferId, newName: String) { } + fun bufferInfo(bufferId: BufferId) = _bufferInfos[bufferId] + fun bufferInfoUpdated(info: BufferInfo) { + _bufferInfos[info.bufferId] = info + } + override fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) { if (msgId < 0) return @@ -118,4 +130,5 @@ class BufferSyncer constructor( private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf() private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf() private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf() + private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>() } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt index 7214a40ff6717f88c24cad9a5d65266b7b7e19b3..fa9001ca0411a4f132e2f25b535ea31dbccc14f1 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt @@ -5,15 +5,17 @@ import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork import de.kuschku.libquassel.quassel.syncables.interfaces.IRpcHandler +import de.kuschku.libquassel.session.Session import de.kuschku.libquassel.session.SignalProxy import de.kuschku.libquassel.util.helpers.deserializeString import java.nio.ByteBuffer -class RpcHandler(override val proxy: SignalProxy) : IRpcHandler { +class RpcHandler(override val session: Session) : IRpcHandler { override fun displayStatusMsg(net: String, msg: String) { } override fun bufferInfoUpdated(bufferInfo: BufferInfo) { + session.bufferSyncer.bufferInfoUpdated(bufferInfo) } override fun identityCreated(identity: QVariantMap) { @@ -23,6 +25,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler { } override fun networkCreated(networkId: NetworkId) { + } override fun networkRemoved(networkId: NetworkId) { @@ -35,7 +38,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler { } override fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) { - proxy.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname) + session.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname) } override fun displayMsg(message: Message) { @@ -68,7 +71,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler { inline fun RPC(function: String, vararg arg: QVariant_) { // Don’t transmit calls back that we just got from the network - if (proxy.shouldRpc(function)) - proxy.callRpc(function, arg.toList()) + if (session.shouldRpc(function)) + session.callRpc(function, arg.toList()) } } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt index 7c9db97568090e7cd3b73bbc3efa4d77fb51bb30..59538665759585f4b4f482c950931223c53d9286 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt @@ -7,12 +7,14 @@ import de.kuschku.libquassel.protocol.Message import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.libquassel.protocol.QVariantMap import de.kuschku.libquassel.quassel.BufferInfo +import de.kuschku.libquassel.session.ISession +import de.kuschku.libquassel.session.Session import de.kuschku.libquassel.session.SignalProxy import java.nio.ByteBuffer @Syncable(name = "RpcHandler") interface IRpcHandler { - val proxy: SignalProxy + val session: Session @Slot("__objectRenamed__") fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt index c3fe644c6061e749493072a6b7fa69ae4a51ff15..3edbb50b579f218a265068d6a6a4c2102ef53c98 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt @@ -16,7 +16,8 @@ import java.io.Closeable @Suppress("LeakingThis") abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable { private val objectStorage: ObjectStorage = ObjectStorage(this) - private val rpcHandler: RpcHandler = RpcHandler(this) + + protected open var rpcHandler: RpcHandler? = null private val toInit = mutableMapOf<ISyncableObject, MutableList<SignalProxyMessage.SyncMessage>>() private val syncQueue = mutableListOf<SignalProxyMessage.SyncMessage>() diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt index 158a82a439b4c9a29370adc308f020ff3d3e983a..3546516f75c12447e42b50082ba23871708b223e 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -5,6 +5,7 @@ import de.kuschku.libquassel.protocol.message.HandshakeMessage import de.kuschku.libquassel.protocol.message.SignalProxyMessage import de.kuschku.libquassel.quassel.QuasselFeature import de.kuschku.libquassel.quassel.syncables.* +import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers import de.kuschku.libquassel.util.compatibility.HandlerService import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO @@ -38,6 +39,8 @@ class Session( override val networks = mutableMapOf<NetworkId, Network>() override val networkConfig = NetworkConfig(this) + override var rpcHandler: RpcHandler? = RpcHandler(this) + init { coreConnection.start() } @@ -54,6 +57,8 @@ class Session( override fun handle(f: HandshakeMessage.SessionInit): Boolean { coreConnection.setState(ConnectionState.INIT) + bufferSyncer.initSetBufferInfos(f.bufferInfos) + f.networkIds?.forEach { val network = Network(it.value(-1), this) networks.put(network.networkId(), network) diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt index 5f56985d3e9f5f2c38e2ac17e34c21bf26a10306..0729334f297cfd496f4c310dd122f91fd2ada442 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt @@ -8,6 +8,7 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers import de.kuschku.libquassel.util.compatibility.HandlerService import de.kuschku.libquassel.util.compatibility.LoggingHandler import de.kuschku.libquassel.util.compatibility.log +import de.kuschku.libquassel.util.helpers.or import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject import javax.net.ssl.X509TrustManager @@ -81,6 +82,3 @@ class SessionManager( offlineSession } } - -fun <T> Observable<T>.or(default: T): T - = this.blockingLatest().firstOrNull() ?: default diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..6347af5301b44db4ab24690956194fea8c661edd --- /dev/null +++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt @@ -0,0 +1,6 @@ +package de.kuschku.libquassel.util.helpers + +import io.reactivex.Observable + +fun <T> Observable<T>.or(default: T): T + = this.blockingLatest().firstOrNull() ?: default