diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt index eaa49a9018793c8a90345f6a8db0945535e1f3cd..688beaa65b0d1372dbcc110324dbef876cff8f36 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt @@ -10,6 +10,7 @@ import de.kuschku.libquassel.protocol.Message.MessageType.* import de.kuschku.libquassel.protocol.Message_Type import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.util.helper.styledAttributes import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter import org.threeten.bp.ZoneId @@ -20,23 +21,21 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer { private val timeFormatter = DateTimeFormatter.ofPattern( (DateFormat.getTimeFormat(context) as SimpleDateFormat).toLocalizedPattern() ) - private val senderColors: IntArray + private lateinit var senderColors: IntArray private val zoneId = ZoneId.systemDefault() init { - val typedArray = context.obtainStyledAttributes( - intArrayOf( - R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3, + context.theme.styledAttributes( + R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3, R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7, R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB, R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF - ) - ) - senderColors = IntArray(16) { - typedArray.getColor(it, 0) + ) { + senderColors = IntArray(16) { + getColor(it, 0) + } } - typedArray.recycle() } override fun layout(type: Message_Type?, hasHighlight: Boolean) @@ -66,16 +65,18 @@ class QuasselMessageRenderer(context: Context) : MessageRenderer { } override fun render(message: QuasselDatabase.DatabaseMessage): FormattedMessage { - return FormattedMessage( - message.messageId, - timeFormatter.format(message.time.atZone(zoneId)), - SpanFormatter.format( - "%s%s: %s", - message.senderPrefixes, - formatNick(message.sender), - message.content + when (message.type) { + else -> return FormattedMessage( + message.messageId, + timeFormatter.format(message.time.atZone(zoneId)), + SpanFormatter.format( + "%s%s: %s", + message.senderPrefixes, + formatNick(message.sender), + message.content + ) ) - ) + } } private fun formatNick(sender: String): CharSequence { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt index 1423c78ad4eda8e08d52513bcbfecac352db76bb..ac243f448aedfe740c60b0a74a63ccbca156969f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarFragment.kt @@ -15,10 +15,7 @@ import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.session.Backend import de.kuschku.libquassel.session.SessionManager import de.kuschku.quasseldroid_ng.R -import de.kuschku.quasseldroid_ng.util.helper.map -import de.kuschku.quasseldroid_ng.util.helper.switchMap -import de.kuschku.quasseldroid_ng.util.helper.switchMapRx -import de.kuschku.quasseldroid_ng.util.helper.visibleIf +import de.kuschku.quasseldroid_ng.util.helper.* import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment class ToolbarFragment : ServiceBoundFragment() { @@ -41,6 +38,14 @@ class ToolbarFragment : ServiceBoundFragment() { } } + private val isSecure: LiveData<Boolean?> = sessionManager.switchMapRx( + SessionManager::session + ).switchMapRx { session -> + session.state.map { state -> + session.sslSession != null + } + } + var title: CharSequence get() = toolbarTitle.text set(value) { @@ -60,11 +65,14 @@ class ToolbarFragment : ServiceBoundFragment() { val view = inflater.inflate(R.layout.fragment_toolbar, container, false) ButterKnife.bind(this, view) - currentBufferInfo.observe( + currentBufferInfo.zip(isSecure).observe( this, Observer { - title = it?.bufferName ?: resources.getString( - R.string.app_name - ) + if (it != null) { + val (info, isSecure) = it + this.title = info?.bufferName ?: resources.getString( + R.string.app_name + ) + } } ) diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml index 13146566a8206109480b8f04364b5f54e032eee2..dee8b88535003c767e9bd9fcd6d27967a3e4f59b 100644 --- a/app/src/main/res/layout/widget_chatmessage_action.xml +++ b/app/src/main/res/layout/widget_chatmessage_action.xml @@ -44,7 +44,8 @@ android:layout_marginEnd="@dimen/message_horizontal" android:layout_marginRight="@dimen/message_horizontal" android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace" /> + android:typeface="monospace" + tools:text="[15:55]" /> <TextView android:id="@+id/content" @@ -53,5 +54,6 @@ android:layout_weight="1" android:textColor="?attr/colorForegroundAction" android:textIsSelectable="true" - android:textStyle="italic" /> + android:textStyle="italic" + tools:text="-*- justJanne loves the new version" /> </LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml index ac45d3d6eb721e77dfc369b0e43204da7832f3f5..53233ad2500fd04413285f1af00ef380d738e9dc 100644 --- a/app/src/main/res/layout/widget_chatmessage_error.xml +++ b/app/src/main/res/layout/widget_chatmessage_error.xml @@ -15,6 +15,7 @@ android:paddingStart="@dimen/message_horizontal" android:paddingTop="@dimen/message_vertical" android:textAppearance="?android:attr/textAppearanceListItemSmall" + tools:background="@android:color/background_light" tools:theme="@style/Theme.ChatTheme.Quassel_Light"> <TextView @@ -24,7 +25,8 @@ android:layout_marginEnd="@dimen/message_horizontal" android:layout_marginRight="@dimen/message_horizontal" android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace" /> + android:typeface="monospace" + tools:text="[15:55]" /> <TextView android:id="@+id/content" @@ -33,5 +35,6 @@ android:layout_weight="1" android:textColor="?attr/colorForegroundError" android:textIsSelectable="true" - android:textStyle="italic" /> + android:textStyle="italic" + tools:text="everyone: deserves a chance to fly. No such channel" /> </LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml index 48b076cb058e41c3f4a0fc27026155987e5d96bd..59248a6abead59011187bea02a9d0a2694766db6 100644 --- a/app/src/main/res/layout/widget_chatmessage_server.xml +++ b/app/src/main/res/layout/widget_chatmessage_server.xml @@ -15,6 +15,7 @@ android:paddingStart="@dimen/message_horizontal" android:paddingTop="@dimen/message_vertical" android:textAppearance="?android:attr/textAppearanceListItemSmall" + tools:background="@android:color/background_light" tools:theme="@style/Theme.ChatTheme.Quassel_Light"> <TextView @@ -24,7 +25,8 @@ android:layout_marginEnd="@dimen/message_horizontal" android:layout_marginRight="@dimen/message_horizontal" android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace" /> + android:typeface="monospace" + tools:text="[15:55]" /> <TextView android:id="@+id/content" @@ -33,5 +35,6 @@ android:layout_weight="1" android:textColor="?attr/colorForegroundSecondary" android:textIsSelectable="true" - android:textStyle="italic" /> + android:typeface="monospace" + tools:text="Connecting to irc.freenode.net:6667..." /> </LinearLayout> diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt index ccc2c7432f7870c7465e2e28b6f44db48c3c04d6..3723825a162d47fab79c5ec7276ad570f442db6b 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt @@ -223,4 +223,7 @@ class CoreConnection( dataBuffer.hexDump() } } + + val sslSession + get() = channel?.sslSession } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt index 2b2a7774022bc8003bcef10e0db77f958f879b74..4cf9c05f5bc1a111722ffa591ed66d326add2d6c 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt @@ -2,13 +2,18 @@ package de.kuschku.libquassel.session import de.kuschku.libquassel.protocol.IdentityId import de.kuschku.libquassel.protocol.NetworkId +import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.syncables.* import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject import java.io.Closeable +import javax.net.ssl.SSLSession interface ISession : Closeable { val state: Observable<ConnectionState> + val coreFeatures: Quassel_Features + val negotiatedFeatures: Quassel_Features + val sslSession: SSLSession? val aliasManager: AliasManager? val backlogManager: BacklogManager? @@ -27,6 +32,11 @@ interface ISession : Closeable { companion object { val NULL = object : ISession { + override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED) + override val coreFeatures: Quassel_Features = Quassel_Features.of() + override val negotiatedFeatures: Quassel_Features = Quassel_Features.of() + override val sslSession: SSLSession? = null + override val rpcHandler: RpcHandler? = null override val aliasManager: AliasManager? = null override val backlogManager: BacklogManager? = null @@ -43,7 +53,6 @@ interface ISession : Closeable { override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0) override fun close() = Unit - override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED) } } } 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 32604d18838fe75dfca7874e84cfb0ce8fb39015..9f729068d4844548193269f5342001ce366b7489 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -23,10 +23,13 @@ class Session( backlogStorage: BacklogStorage, private val userData: Pair<String, String> ) : ProtocolHandler(), ISession { - var coreFeatures: Quassel_Features = Quassel_Feature.NONE - val negotiatedFeatures + override var coreFeatures: Quassel_Features = Quassel_Feature.NONE + override val negotiatedFeatures get() = coreFeatures and clientData.clientFeatures + override val sslSession + get() = coreConnection.sslSession + private val coreConnection = CoreConnection(this, address, handlerService) override val state = coreConnection.state 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 98f166bbd6793368ecf98d68e425f3e749556f05..0f5829de0381342842dddeae59b4e52ec7985983 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt @@ -3,6 +3,7 @@ package de.kuschku.libquassel.session import de.kuschku.libquassel.protocol.ClientData import de.kuschku.libquassel.protocol.IdentityId import de.kuschku.libquassel.protocol.NetworkId +import de.kuschku.libquassel.protocol.Quassel_Features import de.kuschku.libquassel.quassel.syncables.* import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers import de.kuschku.libquassel.util.compatibility.HandlerService @@ -11,9 +12,16 @@ 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.SSLSession import javax.net.ssl.X509TrustManager class SessionManager(offlineSession: ISession, val backlogStorage: BacklogStorage) : ISession { + override val coreFeatures: Quassel_Features + get() = session.or(lastSession).coreFeatures + override val negotiatedFeatures: Quassel_Features + get() = session.or(lastSession).negotiatedFeatures + override val sslSession: SSLSession? + get() = session.or(lastSession).sslSession override val aliasManager: AliasManager? get() = session.or(lastSession).aliasManager override val backlogManager: BacklogManager? diff --git a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt index e6465fa893d19ee4224220b1880974ec400fbc04..50fefbed5a73c755b0f038e7b8360b537f380df2 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt @@ -63,7 +63,7 @@ class WrappedChannel( val managers = arrayOf(certificateManager) context.init(null, managers, null) val factory = context.socketFactory - val socket = factory.createSocket(socket, address.host, address.port.toInt(), true) as SSLSocket + val socket = factory.createSocket(socket, address.host, address.port, true) as SSLSocket socket.useClientMode = true socket.startHandshake() return WrappedChannel.ofSocket(socket) @@ -187,4 +187,7 @@ class WrappedChannel( override fun flush() { flusher?.invoke() } + + val sslSession + get() = (socket as? SSLSocket)?.session }