diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/PersistentSession.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/PersistentSession.kt deleted file mode 100644 index 8942ef9feab3556f3337198da02243ee849a652f..0000000000000000000000000000000000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/PersistentSession.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.kuschku.quasseldroid_ng.persistence - -import de.kuschku.libquassel.protocol.IdentityId -import de.kuschku.libquassel.protocol.NetworkId -import de.kuschku.libquassel.quassel.syncables.* -import de.kuschku.libquassel.session.ConnectionState -import de.kuschku.libquassel.session.ISession -import io.reactivex.subjects.BehaviorSubject - -class PersistentSession : ISession { - override val aliasManager: AliasManager? = null - override val backlogManager: BacklogManager? = null - override val bufferSyncer: BufferSyncer? = null - override val bufferViewManager: BufferViewManager? = null - override val certManagers: Map<IdentityId, CertManager> = emptyMap() - override val coreInfo: CoreInfo? = null - override val dccConfig: DccConfig? = null - override val identities: Map<IdentityId, Identity> = emptyMap() - override val ignoreListManager: IgnoreListManager? = null - override val ircListHelper: IrcListHelper? = null - override val networks: Map<NetworkId, Network> = emptyMap() - override val networkConfig: NetworkConfig? = null - - override fun close() = Unit - override val state: BehaviorSubject<ConnectionState> - = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED) -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt index f3a7a825aa360a610317725739db61259c29969a..1001be61f5ed0dc39ae5351da7a1abd5d701f789 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt @@ -7,24 +7,11 @@ import de.kuschku.libquassel.protocol.Message_Flag import de.kuschku.libquassel.protocol.Message_Type import org.threeten.bp.Instant -@Database(entities = arrayOf(QuasselDatabase.Buffer::class, QuasselDatabase.Network::class, - QuasselDatabase.DatabaseMessage::class), - version = 2) +@Database(entities = arrayOf(QuasselDatabase.DatabaseMessage::class), version = 2) @TypeConverters(QuasselDatabase.DatabaseMessage.MessageTypeConverters::class) abstract class QuasselDatabase : RoomDatabase() { - abstract fun networks(): NetworkDao - abstract fun buffers(): BufferDao abstract fun message(): MessageDao - @Entity(indices = arrayOf(Index("networkId"))) - class Buffer( - @PrimaryKey var bufferId: Int, - var networkId: Int, - var type: Int, - var groupId: Int, - var bufferName: String - ) - @Entity(tableName = "message") open class DatabaseMessage( @PrimaryKey var messageId: Int, @@ -51,60 +38,6 @@ abstract class QuasselDatabase : RoomDatabase() { } } - @Entity - class Network( - @PrimaryKey var networkId: Int, - var networkName: String - ) - - @Entity - class BufferViewConfig( - @PrimaryKey var id: Int, - var name: String - ) - - @Dao - interface NetworkDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun save(vararg entities: QuasselDatabase.Network) - - @Query("SELECT * FROM network WHERE networkId = :networkId") - fun findById(networkId: Int): QuasselDatabase.Network - - @Query("SELECT * FROM network") - fun all(): List<QuasselDatabase.Network> - - @Delete - fun delete(Network: QuasselDatabase.Network) - - @Query("DELETE FROM network") - fun clear() - } - - @Dao - interface BufferDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun save(vararg entities: QuasselDatabase.Buffer) - - @Query("SELECT * FROM buffer WHERE networkId = :bufferId") - fun findById(bufferId: Int): QuasselDatabase.Buffer - - @Query("SELECT * FROM buffer WHERE networkId = :networkId") - fun findByNetwork(networkId: Int): List<QuasselDatabase.Buffer> - - @Query("DELETE FROM buffer WHERE networkId = :networkId") - fun deleteByNetwork(networkId: Int) - - @Query("SELECT * FROM buffer") - fun all(): List<QuasselDatabase.Buffer> - - @Delete - fun delete(buffer: QuasselDatabase.Buffer) - - @Query("DELETE FROM buffer") - fun clear() - } - @Dao interface MessageDao { @Query("SELECT * FROM message WHERE messageId = :messageId") diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt index b2f8a35c0facb7f58ca20b1f66e9325b4094e305..4d0f7ceba55c7cf4e536e3d11049d824a8a0ffbc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt @@ -1,20 +1,23 @@ package de.kuschku.quasseldroid_ng.service import android.arch.lifecycle.LifecycleService +import android.arch.lifecycle.Observer import android.content.Intent import android.os.Binder import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.session.Backend +import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.SessionManager import de.kuschku.libquassel.session.SocketAddress import de.kuschku.quasseldroid_ng.BuildConfig import de.kuschku.quasseldroid_ng.R -import de.kuschku.quasseldroid_ng.persistence.PersistentSession import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread import de.kuschku.quasseldroid_ng.util.compatibility.AndroidHandlerService +import de.kuschku.quasseldroid_ng.util.helper.toLiveData import org.threeten.bp.Instant import java.security.cert.X509Certificate +import java.util.concurrent.TimeUnit import javax.net.ssl.X509TrustManager class QuasselService : LifecycleService() { @@ -35,16 +38,21 @@ class QuasselService : LifecycleService() { private val backendImplementation = object : Backend { override fun sessionManager() = sessionManager - override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String) { + override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String, + reconnect: Boolean) { sessionManager.ifDisconnected { - this.connect(address, user, pass) + this.connect(address, user, pass, reconnect) } } - override fun connect(address: SocketAddress, user: String, pass: String) { + override fun connect(address: SocketAddress, user: String, pass: String, reconnect: Boolean) { disconnect() - val handlerService = AndroidHandlerService() - sessionManager.connect(clientData, trustManager, address, handlerService, user to pass) + sessionManager.connect(clientData, trustManager, address, ::AndroidHandlerService, + user to pass, reconnect) + } + + override fun reconnect() { + sessionManager.reconnect() } override fun disconnect() { @@ -55,15 +63,22 @@ class QuasselService : LifecycleService() { private val handler = AndroidHandlerThread("Backend") private val asyncBackend = object : Backend { - override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String) { + override fun connectUnlessConnected(address: SocketAddress, user: String, pass: String, + reconnect: Boolean) { + handler.post { + backendImplementation.connectUnlessConnected(address, user, pass, reconnect) + } + } + + override fun connect(address: SocketAddress, user: String, pass: String, reconnect: Boolean) { handler.post { - backendImplementation.connectUnlessConnected(address, user, pass) + backendImplementation.connect(address, user, pass, reconnect) } } - override fun connect(address: SocketAddress, user: String, pass: String) { + override fun reconnect() { handler.post { - backendImplementation.connect(address, user, pass) + backendImplementation.reconnect() } } @@ -87,7 +102,7 @@ class QuasselService : LifecycleService() { handler.onCreate() super.onCreate() database = QuasselDatabase.Creator.init(application) - sessionManager = SessionManager(PersistentSession()) + sessionManager = SessionManager(ISession.NULL) clientData = ClientData( identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}", buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE), @@ -98,6 +113,13 @@ class QuasselService : LifecycleService() { ), supportedProtocols = listOf(Protocol.Datastream) ) + sessionManager.state + .distinctUntilChanged() + .debounce(50, TimeUnit.MILLISECONDS) + .toLiveData() + .observe(this, Observer { + sessionManager.reconnect() + }) } override fun onBind(intent: Intent?): QuasselBinder { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt index ba7818a4fc59b58ef8e7f2a422560b0524bf1931..e3418711929e1705790edd411f9a9af2cc46b0b9 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt @@ -107,7 +107,8 @@ class ChatActivity : ServiceBoundActivity() { backendValue.connectUnlessConnected( SocketAddress(account.host, account.port.toShort()), account.user, - account.pass + account.pass, + true ) } }