...
 
Commits (5)
<component name="CopyrightManager">
<copyright>
<option name="allowReplaceRegexp" value="Quasseldroid" />
<option name="notice" value="Quasseldroid - Quassel client for Android&#10;&#10;Copyright (c) &amp;#36;today.year Janne Koschinski&#10;Copyright (c) &amp;#36;today.year The Quassel Project&#10;&#10;This program is free software: you can redistribute it and/or modify it&#10;under the terms of the GNU General Public License version 3 as published&#10;by the Free Software Foundation.&#10;&#10;This program is distributed in the hope that it will be useful,&#10;but WITHOUT ANY WARRANTY; without even the implied warranty of&#10;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&#10;GNU General Public License for more details.&#10;&#10;You should have received a copy of the GNU General Public License along&#10;with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;." />
<option name="myName" value="Quasseldroid" />
<option name="notice" value="Quasseldroid - Quassel client for Android&#10;&#10;Copyright (c) &amp;#36;today.year Janne Koschinski&#10;Copyright (c) &amp;#36;today.year Ken Børge Viktil&#10;Copyright (c) &amp;#36;today.year Magnus Fjell&#10;Copyright (c) &amp;#36;today.year Martin Sandsmark&#10;Copyright (c) &amp;#36;today.year The Quassel Project&#10;&#10;This program is free software: you can redistribute it and/or modify it&#10;under the terms of the GNU General Public License version 3 as published&#10;by the Free Software Foundation.&#10;&#10;This program is distributed in the hope that it will be useful,&#10;but WITHOUT ANY WARRANTY; without even the implied warranty of&#10;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&#10;GNU General Public License for more details.&#10;&#10;You should have received a copy of the GNU General Public License along&#10;with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;." />
</copyright>
</component>
\ No newline at end of file
<component name="CopyrightManager">
<settings>
<module2copyright>
<element module="Project Source Files" copyright="Quasseldroid" />
</module2copyright>
<LanguageOptions name="HTML">
<option name="fileTypeOverride" value="3" />
<option name="prefixLines" value="false" />
......
......@@ -152,6 +152,7 @@ dependencies {
}
// UI
implementation("com.leinardi.android", "speed-dial", "2.0.1")
implementation("me.zhanghai.android.materialprogressbar", "library", "1.6.1")
withVersion("0.9.6.0") {
implementation("com.afollestad.material-dialogs", "core", version)
......
......@@ -753,6 +753,14 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
}
})
connectionStatusDisplay.setOnClickListener {
viewModel.sessionManager.value?.orNull()?.apply {
ifDisconnected {
autoReconnect()
}
}
}
// Show Connection Progress Bar
viewModel.connectionProgress.toLiveData().observe(this, Observer {
val (state, progress, max) = it ?: Triple(ConnectionState.DISCONNECTED, 0, 0)
......@@ -790,6 +798,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
}
ConnectionState.CONNECTED -> {
progressBar.visibility = View.INVISIBLE
connectionStatusDisplay.setMode(WarningBarView.MODE_NONE)
}
}
......
......@@ -91,6 +91,10 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
@BindView(R.id.buffer_search_container)
lateinit var bufferSearchContainer: ViewGroup
/*
@BindView(R.id.fab)
lateinit var fab: SpeedDialView
*/
@Inject
lateinit var appearanceSettings: AppearanceSettings
......@@ -531,6 +535,42 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
bufferSearch.setText("")
}
/*
@ColorInt var colorLabel = 0
@ColorInt var colorLabelBackground = 0
view.context.theme.styledAttributes(R.attr.colorTextPrimary, R.attr.colorBackgroundCard) {
colorLabel = getColor(0, 0)
colorLabelBackground = getColor(1, 0)
}
fab.addActionItem(
SpeedDialActionItem.Builder(R.id.fab_create, R.drawable.ic_add)
.setFabImageTintColor(0xffffffffu.toInt())
.setLabel(R.string.label_create_channel)
.setLabelBackgroundColor(colorLabelBackground)
.setLabelColor(colorLabel)
.create()
)
fab.addActionItem(
SpeedDialActionItem.Builder(R.id.fab_join, R.drawable.ic_channel)
.setFabImageTintColor(0xffffffffu.toInt())
.setLabel(R.string.label_join_long)
.setLabelBackgroundColor(colorLabelBackground)
.setLabelColor(colorLabel)
.create()
)
fab.addActionItem(
SpeedDialActionItem.Builder(R.id.fab_query, R.drawable.ic_account)
.setFabImageTintColor(0xffffffffu.toInt())
.setLabel(R.string.label_query_medium)
.setLabelBackgroundColor(colorLabelBackground)
.setLabelColor(colorLabel)
.create()
)
*/
return view
}
......
/*
* Quasseldroid - Quassel client for Android
*
* Copyright (c) 2019 Janne Koschinski
* Copyright (c) 2019 The Quassel Project
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3 as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.kuschku.quasseldroid.ui.info.user
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.chat.ChatActivity
import de.kuschku.quasseldroid.util.helper.visibleIf
import de.kuschku.quasseldroid.util.lists.ListAdapter
import de.kuschku.quasseldroid.viewmodel.data.BufferProps
class ChannelAdapter : ListAdapter<BufferProps, ChannelAdapter.ChannelViewHolder>(
object : DiffUtil.ItemCallback<BufferProps>() {
override fun areItemsTheSame(oldItem: BufferProps, newItem: BufferProps) =
oldItem.info.bufferId == newItem.info.bufferId
override fun areContentsTheSame(oldItem: BufferProps, newItem: BufferProps) =
oldItem == newItem
}
) {
private var clickListener: ((NetworkId, String) -> Unit)? = null
fun setOnClickListener(listener: ((NetworkId, String) -> Unit)?) {
this.clickListener = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ChannelViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.widget_buffer, parent, false
),
clickListener = clickListener
)
override fun onBindViewHolder(holder: ChannelViewHolder, position: Int) =
holder.bind(getItem(position))
class ChannelViewHolder(
itemView: View,
private val clickListener: ((NetworkId, String) -> Unit)? = null
) : RecyclerView.ViewHolder(itemView) {
@BindView(R.id.status)
lateinit var status: ImageView
@BindView(R.id.name)
lateinit var name: TextView
@BindView(R.id.description)
lateinit var description: TextView
var info: BufferInfo? = null
init {
ButterKnife.bind(this, itemView)
itemView.setOnClickListener {
info?.let {
ChatActivity.launch(
itemView.context,
networkId = it.networkId,
channel = it.bufferName
)
}
}
}
fun bind(props: BufferProps) {
info = props.info
name.text = props.info.bufferName
description.text = props.description
description.visibleIf(props.description.isNotBlank())
status.setImageDrawable(props.fallbackDrawable)
}
}
}
......@@ -23,6 +23,7 @@ import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.IrcUser
import de.kuschku.libquassel.quassel.syncables.Network
import de.kuschku.quasseldroid.viewmodel.data.BufferProps
data class IrcUserInfo(
val networkId: NetworkId,
......@@ -37,5 +38,6 @@ data class IrcUserInfo(
val network: Network? = null,
val knownToCore: Boolean = false,
val info: BufferInfo? = null,
val ircUser: IrcUser? = null
val ircUser: IrcUser? = null,
val channels: List<BufferProps> = emptyList()
)
......@@ -31,12 +31,18 @@ import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.BufferId
import de.kuschku.libquassel.protocol.Buffer_Type
import de.kuschku.libquassel.protocol.Message_Type
import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.BufferSyncer
import de.kuschku.libquassel.quassel.syncables.IrcChannel
import de.kuschku.libquassel.quassel.syncables.IrcUser
import de.kuschku.libquassel.util.Optional
import de.kuschku.libquassel.util.helpers.nullIf
......@@ -46,6 +52,7 @@ import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.ChatActivity
import de.kuschku.quasseldroid.ui.coresettings.ignorelist.IgnoreListActivity
import de.kuschku.quasseldroid.util.ColorContext
import de.kuschku.quasseldroid.util.ShortcutCreationHelper
import de.kuschku.quasseldroid.util.avatars.AvatarHelper
import de.kuschku.quasseldroid.util.avatars.MatrixApi
......@@ -57,6 +64,9 @@ import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod
import de.kuschku.quasseldroid.util.ui.LinkLongClickMenuHelper
import de.kuschku.quasseldroid.viewmodel.data.Avatar
import de.kuschku.quasseldroid.viewmodel.data.BufferHiddenState
import de.kuschku.quasseldroid.viewmodel.data.BufferProps
import de.kuschku.quasseldroid.viewmodel.data.BufferStatus
import io.reactivex.Observable
import javax.inject.Inject
......@@ -115,6 +125,9 @@ class UserInfoFragment : ServiceBoundFragment() {
@BindView(R.id.server)
lateinit var server: TextView
@BindView(R.id.common_channels)
lateinit var commonChannels: RecyclerView
@Inject
lateinit var contentFormatter: ContentFormatter
......@@ -144,32 +157,83 @@ class UserInfoFragment : ServiceBoundFragment() {
actionShortcut.visibleIf(currentBufferInfo != null)
}
val commonChannelsAdapter = ChannelAdapter()
commonChannels.layoutManager = LinearLayoutManager(context)
commonChannels.itemAnimator = DefaultItemAnimator()
commonChannels.adapter = commonChannelsAdapter
val colorContext = ColorContext(requireContext(), messageSettings)
val colorAccent = requireContext().theme.styledAttributes(R.attr.colorAccent) {
getColor(0, 0)
}
val colorAway = requireContext().theme.styledAttributes(R.attr.colorAway) {
getColor(0, 0)
}
combineLatest(viewModel.session, viewModel.networks).switchMap { (sessionOptional, networks) ->
fun processUser(user: IrcUser, info: BufferInfo? = null): Optional<IrcUserInfo> {
fun processUser(user: IrcUser, bufferSyncer: BufferSyncer? = null,
info: BufferInfo? = null): Observable<Optional<IrcUserInfo>> {
actionShortcut.post(::updateShortcutVisibility)
return when {
user == IrcUser.NULL && info != null -> Optional.of(IrcUserInfo(
user == IrcUser.NULL && info != null -> Observable.just(Optional.of(IrcUserInfo(
networkId = info.networkId,
nick = info.bufferName ?: "",
knownToCore = true,
info = info
))
user == IrcUser.NULL -> Optional.empty()
else -> Optional.of(IrcUserInfo(
networkId = user.network().networkId(),
nick = user.nick(),
user = user.user(),
host = user.host(),
account = user.account(),
server = user.server(),
realName = user.realName(),
isAway = user.isAway(),
awayMessage = user.awayMessage(),
network = user.network(),
knownToCore = true,
info = info,
ircUser = user
))
)))
user == IrcUser.NULL -> Observable.just(Optional.empty())
else -> {
combineLatest(user.channels().map { channelName ->
user.network().liveIrcChannel(
channelName
).switchMap { channel ->
channel.updates().map {
bufferSyncer?.find(
bufferName = channelName,
networkId = user.network().networkId()
)?.let { info ->
val bufferStatus =
if (it == IrcChannel.NULL) BufferStatus.OFFLINE
else BufferStatus.ONLINE
val color =
if (bufferStatus == BufferStatus.ONLINE) colorAccent
else colorAway
val fallbackDrawable = colorContext.buildTextDrawable("#", color)
BufferProps(
info = info,
network = user.network().networkInfo(),
description = it.topic(),
activity = Message_Type.of(),
bufferStatus = bufferStatus,
hiddenState = BufferHiddenState.VISIBLE,
networkConnectionState = user.network().connectionState(),
fallbackDrawable = fallbackDrawable
)
}
}
}
}).map {
Optional.of(IrcUserInfo(
networkId = user.network().networkId(),
nick = user.nick(),
user = user.user(),
host = user.host(),
account = user.account(),
server = user.server(),
realName = user.realName(),
isAway = user.isAway(),
awayMessage = user.awayMessage(),
network = user.network(),
knownToCore = true,
info = info,
ircUser = user,
channels = it.filterNotNull()
))
}
}
}
}
......@@ -178,16 +242,16 @@ class UserInfoFragment : ServiceBoundFragment() {
val bufferSyncer = session?.bufferSyncer
val bufferInfo = bufferSyncer?.bufferInfo(bufferId)
bufferInfo?.let {
networks[it.networkId]?.liveIrcUser(it.bufferName)?.switchMap(IrcUser::updates)?.map {
processUser(it, bufferInfo)
networks[it.networkId]?.liveIrcUser(it.bufferName)?.switchMap(IrcUser::updates)?.switchMap {
processUser(it, bufferSyncer, bufferInfo)
}
}
} else {
networks[networkId]
?.liveIrcUser(nickName)
?.switchMap(IrcUser::updates)
?.map { user -> processUser(user) }
} ?: Observable.just(IrcUser.NULL).map { user -> processUser(user) }
?.switchMap { user -> processUser(user, sessionOptional?.orNull()?.bufferSyncer) }
} ?: Observable.just(IrcUser.NULL).switchMap { user -> processUser(user, null, null) }
}.toLiveData().observe(this, Observer {
val user = it.orNull()
if (user != null) {
......@@ -322,6 +386,8 @@ class UserInfoFragment : ServiceBoundFragment() {
}
}
}
commonChannelsAdapter.submitList(user.channels)
}
})
......
......@@ -23,6 +23,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:fillColor="#fff"
android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" />
</vector>
......@@ -17,12 +17,11 @@
with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
......@@ -48,21 +47,46 @@
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include layout="@layout/widget_search" />
<include layout="@layout/widget_search" />
<de.kuschku.quasseldroid.util.ui.view.WarningBarView
android:id="@+id/feature_context_bufferactivitysync"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:icon="@drawable/ic_alert"
app:text="@string/label_feature_context_bufferactivitysync" />
<de.kuschku.quasseldroid.util.ui.view.WarningBarView
android:id="@+id/feature_context_bufferactivitysync"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:icon="@drawable/ic_alert"
app:text="@string/label_feature_context_bufferactivitysync" />
</LinearLayout>
</com.google.android.material.appbar.AppBarLayout>
<de.kuschku.quasseldroid.util.ui.fastscroll.views.FastScrollRecyclerView
android:id="@+id/chatList"
style="@style/Widget.FastScroller"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:listitem="@layout/widget_buffer" />
</LinearLayout>
<!--
<com.leinardi.android.speeddial.SpeedDialOverlayLayout
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.leinardi.android.speeddial.SpeedDialView
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
app:layout_behavior="@string/speeddial_scrolling_view_snackbar_behavior"
app:sdMainFabClosedSrc="@drawable/ic_add"
app:sdOverlayLayout="@id/overlay" />
-->
</androidx.coordinatorlayout.widget.CoordinatorLayout>
......@@ -251,6 +251,15 @@
style="@style/Widget.Info.Item.Description"
android:text="@string/label_user_server" />
</LinearLayout>
<TextView
style="@style/Widget.Info.Section"
android:text="@string/label_user_common_channels" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/common_channels"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
......@@ -46,6 +46,7 @@
<string name="label_copy">Kopieren</string>
<string name="label_crashes">Absturzberichte</string>
<string name="label_crashes_empty">Keine Absturzberichte gefunden</string>
<string name="label_create_channel">Channel erstellen</string>
<string name="label_delete">Löschen</string>
<string name="label_delete_all">Alle Löschen</string>
<string name="label_descending">Absteigend</string>
......@@ -102,6 +103,7 @@
<string name="label_privacy_policy">Datenschutzerklärung</string>
<string name="label_query">Dialog</string>
<string name="label_query_long">Öffnet einen privaten Chat</string>
<string name="label_query_medium">Privaten Chat öffnen</string>
<string name="label_rename">Umbenennen</string>
<string name="label_reply">Antworten</string>
<string name="label_reset">Zurücksetzen</string>
......
......@@ -25,6 +25,7 @@
<string name="label_user_ident">Ident</string>
<string name="label_user_host">Host</string>
<string name="label_user_server">Server</string>
<string name="label_user_common_channels">Gemeinsame Channels</string>
<string name="label_core_version">Version</string>
<string name="label_core_uptime">Betriebsdauer</string>
......
......@@ -158,6 +158,7 @@
<string name="preference_initial_amount_title">Anfängliche Verlaufsgröße</string>
<string name="preference_initial_amount_summary">Anzahl an Nachrichten die beim ersten Öffnen eines Chats geladen werden</string>
<string name="preference_clear_cache_title">Nachrichten-Cache leeren</string>
<string name="preference_connection_title">Verbindung</string>
......
......@@ -25,7 +25,6 @@
<string name="label_user_ident">Identité</string>
<string name="label_user_host">Hôte</string>
<string name="label_user_server">Serveur</string>
<string name="label_core_version">Version</string>
<string name="label_core_uptime">Durée de Fonctionnement</string>
<string name="label_core_security">Sécurité</string>
......
......@@ -142,7 +142,6 @@
<string name="preference_initial_amount_title">Montant Initial</string>
<string name="preference_initial_amount_summary">Nombre de messages à montrer quand le tchat est initialement ouvert</string>
<string name="preference_connection_title">Connection</string>
<string name="preference_show_notification_title">Montrer la notification</string>
......
......@@ -25,7 +25,6 @@
<string name="label_user_ident">Ident</string>
<string name="label_user_host">Host</string>
<string name="label_user_server">Server</string>
<string name="label_core_version">Versione</string>
<string name="label_core_uptime">Tempo di attività</string>
<string name="label_core_security">Sicurezza</string>
......
......@@ -46,7 +46,7 @@
<item quantity="other">Netsplit tra %1$s e %2$s terminato: %3$d utenti entrati: %4$s</item>
</plurals>
<plurals name="message_netsplit_quit">
<item quantity="one">Netsplit tra %1$s e%2$s: %3$d utente quit: %4$s</item>
<item quantity="other">Netsplit tra %1$s e%2$s: %3$d utenti disconnessi: %4$s</item>
<item quantity="one">Netsplit tra %1$s e %2$s: %3$d utente disconnesso: %4$s</item>
<item quantity="other">Netsplit tra %1$s e %2$s: %3$d utenti disconnessi: %4$s</item>
</plurals>
</resources>
......@@ -158,7 +158,6 @@
<string name="preference_initial_amount_title">Quantità iniziale</string>
<string name="preference_initial_amount_summary">Numero di messaggi da caricare all’apertura di una chat la prima volta</string>
<string name="preference_connection_title">Connessione</string>
<string name="preference_show_notification_title">Mostra notifica</string>
......
......@@ -25,7 +25,6 @@
<string name="label_user_ident">Ident</string>
<string name="label_user_host">Host</string>
<string name="label_user_server">Serveris</string>
<string name="label_core_version">Versija</string>
<string name="label_core_uptime">Veikimo laikas</string>
<string name="label_core_security">Saugumas</string>
......
......@@ -155,7 +155,6 @@
<string name="preference_initial_amount_title">Pradinis dydis</string>
<string name="preference_initial_amount_summary">Žinučių kiekis, kuris bus užkraunamas pirmą kartą atvėrus buferį</string>
<string name="preference_connection_title">Ryšys</string>
<string name="preference_show_notification_title">Rodyti aktyvųjį pranešimą</string>
......
......@@ -25,7 +25,6 @@
<string name="label_user_ident">Identidade</string>
<string name="label_user_host">Anfitrião</string>
<string name="label_user_server">Servidor</string>
<string name="label_core_version">Versão</string>
<string name="label_core_uptime">Tempo de atividade</string>
<string name="label_core_security">Segurança</string>
......
......@@ -158,7 +158,6 @@
<string name="preference_initial_amount_title">Quantidade inicial</string>
<string name="preference_initial_amount_summary">Número de mensagens para carregar ao abrir uma janela pela primeira vez</string>
<string name="preference_connection_title">Ligação</string>
<string name="preference_show_notification_title">Mostrar notificação</string>
......
......@@ -25,7 +25,6 @@
<string name="label_user_ident">Ident</string>
<string name="label_user_host">Host</string>
<string name="label_user_server">Server</string>
<string name="label_core_version">Verzija</string>
<string name="label_core_uptime">Uptime</string>
<string name="label_core_security">Bezbednost</string>
......
......@@ -153,7 +153,6 @@
<string name="preference_initial_amount_title">Početna količina</string>
<string name="preference_initial_amount_summary">Broj poruka koje će biti učitane pri prvom otvaranju bafera</string>
<string name="preference_connection_title">Veza</string>
<string name="preference_show_notification_title">Prikazuj obavještenja</string>
......
......@@ -23,4 +23,8 @@
<item name="tag_daychange_content" type="id" />
<item name="tag_markerline" type="id" />
<item name="fab_query" type="id" />
<item name="fab_join" type="id" />
<item name="fab_create" type="id" />
</resources>
......@@ -46,6 +46,7 @@
<string name="label_copy">Copy</string>
<string name="label_crashes">Crashes</string>
<string name="label_crashes_empty">No crash reports found</string>
<string name="label_create_channel">Create Channel</string>
<string name="label_delete">Delete</string>
<string name="label_delete_all">Delete All</string>
<string name="label_descending">Descending</string>
......@@ -102,6 +103,7 @@
<string name="label_privacy_policy">Privacy Policy</string>
<string name="label_query">Query</string>
<string name="label_query_long">Open private chat with user</string>
<string name="label_query_medium">Open private chat</string>
<string name="label_rename">Rename</string>
<string name="label_reply">Reply</string>
<string name="label_reset">Reset</string>
......
......@@ -25,6 +25,7 @@
<string name="label_user_ident">Ident</string>
<string name="label_user_host">Host</string>
<string name="label_user_server">Server</string>
<string name="label_user_common_channels">Common Channels</string>
<string name="label_core_version">Version</string>
<string name="label_core_uptime">Uptime</string>
......
......@@ -33,9 +33,9 @@ android.enableD8=true
# Enable new Android R8 Optimizer
android.enableR8=true
# Enable gradle build cache
org.gradle.caching=true
org.gradle.caching=false
# Enable android build cache
android.enableBuildCache=true
android.enableBuildCache=false
# Enable AndroidX
android.useAndroidX=true
android.enableJetifier=true