diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 369e64e73a432bfebd27f4e553b573fba54f0f8a..7b23fbd97afd9f1c5e62b0e90e034246c5935911 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,12 @@ android:label="@string/settings_identity_title" android:parentActivityName=".ui.coresettings.CoreSettingsActivity" android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.coresettings.chatlist.ChatListActivity" + android:exported="false" + android:label="@string/settings_chatlist_title" + android:parentActivityName=".ui.coresettings.CoreSettingsActivity" + android:windowSoftInputMode="adjustResize" /> <activity android:name=".ui.coresettings.networkconfig.NetworkConfigActivity" android:exported="false" diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt index 16d9f31a2d82efde869c413b51c976968a2d87a7..5fa67e3b46e06574d85e6320508433d48fd00e80 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt @@ -18,6 +18,8 @@ import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsFragmentProvider +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListActivity +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity @@ -54,6 +56,9 @@ abstract class ActivityModule { @ContributesAndroidInjector(modules = [IdentityFragmentProvider::class]) abstract fun bindIdentityActivity(): IdentityActivity + @ContributesAndroidInjector(modules = [ChatListFragmentProvider::class]) + abstract fun bindChatListActivity(): ChatListActivity + @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class]) abstract fun bindNetworkConfigActivity(): NetworkConfigActivity @@ -68,4 +73,4 @@ abstract class ActivityModule { @ContributesAndroidInjector abstract fun bindQuasselService(): QuasselService -} \ No newline at end of file +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt index 5fa61ef00eb1f8d5f0ccccf9523803b3b378ac47..47a3e50e4f666d0f16b20d066b279f21b5d395ae 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt @@ -16,6 +16,7 @@ import de.kuschku.libquassel.quassel.syncables.BufferViewConfig import de.kuschku.libquassel.quassel.syncables.Identity import de.kuschku.libquassel.quassel.syncables.Network import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListActivity import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity import de.kuschku.quasseldroid.util.helper.combineLatest @@ -55,11 +56,9 @@ class CoreSettingsFragment : ServiceBoundFragment() { } val chatListAdapter = SettingsItemAdapter { - /* - val intent = Intent(requireContext(), BufferViewConfigActivity::class.java) - intent.putExtra("bufferviewconfig", it) + val intent = Intent(requireContext(), ChatListActivity::class.java) + intent.putExtra("chatlist", it) startActivity(intent) - */ } val itemDecoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) @@ -99,8 +98,8 @@ class CoreSettingsFragment : ServiceBoundFragment() { chatlists.addItemDecoration(itemDecoration) ViewCompat.setNestedScrollingEnabled(chatlists, false) - viewModel.bufferViewConfigs.switchMap { - combineLatest(it.map(BufferViewConfig::live_config)).map { + viewModel.bufferViewConfigMap.switchMap { + combineLatest(it.values.map(BufferViewConfig::liveUpdates)).map { it.map { SettingsItem(it.bufferViewId(), it.bufferViewName()) }.sortedBy(SettingsItem::name) @@ -115,4 +114,4 @@ class CoreSettingsFragment : ServiceBoundFragment() { return view } -} \ No newline at end of file +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..7ebf8cb2adf9d3a5d3a7087144fad15f1aafcc90 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt @@ -0,0 +1,5 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import de.kuschku.quasseldroid.util.ui.SettingsActivity + +class ChatListActivity : SettingsActivity(ChatListFragment()) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..c38a27a9c0bfb089f427dae2c07bd0246f82e29a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt @@ -0,0 +1,90 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import android.arch.lifecycle.Observer +import android.os.Bundle +import android.support.v7.widget.SwitchCompat +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import de.kuschku.libquassel.quassel.syncables.BufferViewConfig +import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment +import de.kuschku.quasseldroid.util.helper.toLiveData +import io.reactivex.Observable + +class ChatListFragment : SettingsFragment() { + private var chatlist: Pair<BufferViewConfig, BufferViewConfig>? = null + + @BindView(R.id.buffer_view_name) + lateinit var bufferViewName: TextView + + @BindView(R.id.show_search) + lateinit var showSearch: SwitchCompat + + @BindView(R.id.sort_alphabetically) + lateinit var sortAlphabetically: SwitchCompat + + @BindView(R.id.add_new_buffers_automatically) + lateinit var addNewBuffersAutomatically: SwitchCompat + + @BindView(R.id.disable_decoration) + lateinit var disableDecoration: SwitchCompat + + @BindView(R.id.show_channels) + lateinit var showChannels: SwitchCompat + + @BindView(R.id.show_queries) + lateinit var showQueries: SwitchCompat + + @BindView(R.id.hide_inactive_buffers) + lateinit var hideInactiveBuffers: SwitchCompat + + @BindView(R.id.hide_inactive_networks) + lateinit var hideInactiveNetworks: SwitchCompat + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.settings_chatlist, container, false) + ButterKnife.bind(this, view) + + val chatlistId = arguments?.getInt("chatlist", -1) ?: -1 + + viewModel.bufferViewConfigMap.switchMap { + it[chatlistId]?.liveUpdates() ?: Observable.empty() + }.firstElement() + .toLiveData().observe(this, Observer { + if (it != null) { + this.chatlist = Pair(it, it.copy()) + this.chatlist?.let { (_, data) -> + bufferViewName.text = data.bufferViewName() + showSearch.isChecked = data.showSearch() + sortAlphabetically.isChecked = data.sortAlphabetically() + addNewBuffersAutomatically.isChecked = data.addNewBuffersAutomatically() + disableDecoration.isChecked = data.disableDecoration() + + hideInactiveBuffers.isChecked = data.hideInactiveBuffers() + hideInactiveNetworks.isChecked = data.hideInactiveNetworks() + } + } + }) + + return view + } + + override fun onSave() = chatlist?.let { (it, data) -> + data.setBufferViewName(bufferViewName.text.toString()) + data.setShowSearch(showSearch.isChecked) + data.setSortAlphabetically(sortAlphabetically.isChecked) + data.setAddNewBuffersAutomatically(addNewBuffersAutomatically.isChecked) + data.setDisableDecoration(disableDecoration.isChecked) + + data.setHideInactiveBuffers(hideInactiveBuffers.isChecked) + data.setHideInactiveNetworks(hideInactiveNetworks.isChecked) + + it.requestUpdate(data.toVariantMap()) + true + } ?: false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt new file mode 100644 index 0000000000000000000000000000000000000000..033de4aae7ce9170fa81867ce449c41af0079abc --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class ChatListFragmentProvider { + @ContributesAndroidInjector + abstract fun bindChatListFragment(): ChatListFragment +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt index d83068daf3b850846f3c319528b23a50fb1212fb..6d16e5f6b1a8fd5ca299d11516a12545d903bef8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt @@ -17,11 +17,11 @@ import butterknife.BindView import butterknife.ButterKnife import com.afollestad.materialdialogs.MaterialDialog import de.kuschku.libquassel.quassel.syncables.Identity -import de.kuschku.libquassel.util.Optional import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.util.helper.setDependent import de.kuschku.quasseldroid.util.helper.toLiveData +import io.reactivex.Observable class IdentityFragment : SettingsFragment() { @@ -73,11 +73,9 @@ class IdentityFragment : SettingsFragment() { val identityId = arguments?.getInt("identity", -1) ?: -1 - viewModel.identities.map { - Optional.ofNullable(it[identityId]) - }.filter(Optional<Identity>::isPresent) - .map(Optional<Identity>::get) - .firstElement() + viewModel.identities.switchMap { + it[identityId]?.liveUpdates() ?: Observable.empty() + }.firstElement() .toLiveData().observe(this, Observer { if (it != null) { this.identity = Pair(it, it.copy()) @@ -180,4 +178,4 @@ class IdentityFragment : SettingsFragment() { adapter.removeNick(viewHolder.adapterPosition) } } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c1dc6366a7df10940373ff572627c6feba1c090 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24"> + <path + android:fillColor="#000" + android:pathData="M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml new file mode 100644 index 0000000000000000000000000000000000000000..9cc8a518dda896491398a6f1d7d483efb0731d7d --- /dev/null +++ b/app/src/main/res/drawable/ic_eye.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24"> + <path + android:fillColor="#000" + android:pathData="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z" /> +</vector> diff --git a/app/src/main/res/layout/settings_chatlist.xml b/app/src/main/res/layout/settings_chatlist.xml new file mode 100644 index 0000000000000000000000000000000000000000..d930f8e804ca5bf572e8d63b113a5fe6ebecf53f --- /dev/null +++ b/app/src/main/res/layout/settings_chatlist.xml @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v4.widget.NestedScrollView 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:scrollbars="vertical"> + + <LinearLayout style="@style/Widget.CoreSettings.Wrapper"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="48dp"> + + <android.support.v7.widget.AppCompatImageView + style="@style/Widget.CoreSettings.PrimaryItemIcon" + app:srcCompat="@drawable/ic_eye" /> + + <TextView + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_ui" /> + </LinearLayout> + + <LinearLayout + style="@style/Widget.CoreSettings.DependentGroup" + android:visibility="visible"> + + <android.support.design.widget.TextInputLayout + style="@style/Widget.CoreSettings.EditTextLayout" + android:hint="@string/settings_chatlist_buffer_view_name"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/buffer_view_name" + style="@style/Widget.CoreSettings.EditText" + tools:text="All Chats" /> + </android.support.design.widget.TextInputLayout> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/show_search" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_show_search" /> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/sort_alphabetically" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_sort_alphabetically" /> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/add_new_buffers_automatically" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_add_new_buffers_automatically" /> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="48dp"> + + <android.support.v7.widget.AppCompatImageView + style="@style/Widget.CoreSettings.PrimaryItemIcon" + app:srcCompat="@drawable/ic_server_network" /> + + <TextView + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_network" /> + </LinearLayout> + + <LinearLayout + style="@style/Widget.CoreSettings.DependentGroup" + android:visibility="visible"> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/disable_decoration" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_disable_decoration" /> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="48dp"> + + <android.support.v7.widget.AppCompatImageView + style="@style/Widget.CoreSettings.PrimaryItemIcon" + app:srcCompat="@drawable/ic_tag_text" /> + + <TextView + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_types" /> + </LinearLayout> + + <LinearLayout + style="@style/Widget.CoreSettings.DependentGroup" + android:visibility="visible"> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/show_channels" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_show_channels" /> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/show_queries" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_show_queries" /> + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="48dp"> + + <android.support.v7.widget.AppCompatImageView + style="@style/Widget.CoreSettings.PrimaryItemIcon" + app:srcCompat="@drawable/ic_clock" /> + + <TextView + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_activity" /> + </LinearLayout> + + <LinearLayout + style="@style/Widget.CoreSettings.DependentGroup" + android:visibility="visible"> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/hide_inactive_buffers" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_hide_inactive_buffers" /> + + <android.support.v7.widget.SwitchCompat + android:id="@+id/hide_inactive_networks" + style="@style/Widget.CoreSettings.PrimaryItemSwitch" + android:text="@string/settings_chatlist_hide_inactive_networks" /> + </LinearLayout> + </LinearLayout> +</android.support.v4.widget.NestedScrollView> diff --git a/app/src/main/res/layout/settings_identity.xml b/app/src/main/res/layout/settings_identity.xml index 6d490acd67b56bb04e1815e46f10b9eb6632f910..7245098b9e70b75a5b12cc22970e49dbbbd0f502 100644 --- a/app/src/main/res/layout/settings_identity.xml +++ b/app/src/main/res/layout/settings_identity.xml @@ -150,7 +150,7 @@ <android.support.v7.widget.AppCompatImageView style="@style/Widget.CoreSettings.PrimaryItemIcon" - app:srcCompat="@drawable/ic_history" /> + app:srcCompat="@drawable/ic_clock" /> <TextView style="@style/Widget.CoreSettings.PrimaryItemSwitch" @@ -170,35 +170,27 @@ style="@style/Widget.CoreSettings.EditText" tools:text="Gone Fishing." /> </android.support.design.widget.TextInputLayout> - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="48dp"> - - <Space style="@style/Widget.CoreSettings.PrimaryItemIcon" /> <android.support.v7.widget.SwitchCompat android:id="@+id/detach_away" style="@style/Widget.CoreSettings.PrimaryItemSwitch" android:text="@string/settings_identity_detach_away" /> - </LinearLayout> - <LinearLayout - android:id="@+id/detach_away_group" - style="@style/Widget.CoreSettings.DependentGroup" - tools:visibility="visible"> + <LinearLayout + android:id="@+id/detach_away_group" + android:layout_width="match_parent" + android:layout_height="wrap_content"> - <android.support.design.widget.TextInputLayout - style="@style/Widget.CoreSettings.EditTextLayout" - android:hint="@string/settings_identity_detach_away_reason"> + <android.support.design.widget.TextInputLayout + style="@style/Widget.CoreSettings.EditTextLayout" + android:hint="@string/settings_identity_detach_away_reason"> - <android.support.design.widget.TextInputEditText - android:id="@+id/detach_away_reason" - style="@style/Widget.CoreSettings.EditText" - tools:text="Gone Fishing." /> - </android.support.design.widget.TextInputLayout> + <android.support.design.widget.TextInputEditText + android:id="@+id/detach_away_reason" + style="@style/Widget.CoreSettings.EditText" + tools:text="Gone Fishing." /> + </android.support.design.widget.TextInputLayout> + </LinearLayout> </LinearLayout> </LinearLayout> -</android.support.v4.widget.NestedScrollView> \ No newline at end of file +</android.support.v4.widget.NestedScrollView> diff --git a/app/src/main/res/values/strings_settings.xml b/app/src/main/res/values/strings_settings.xml index 7aaab55a8822aadc87b8b619e0ea143a3b56388f..92777c89af789fc448e0f2ac8d2eab4e10343c96 100644 --- a/app/src/main/res/values/strings_settings.xml +++ b/app/src/main/res/values/strings_settings.xml @@ -21,6 +21,19 @@ <string name="settings_chatlists_title">Chatlists</string> <string name="settings_chatlist_title">Chatlist</string> + <string name="settings_chatlist_ui">User Interface</string> + <string name="settings_chatlist_buffer_view_name">Name</string> + <string name="settings_chatlist_show_search">Show Search</string> + <string name="settings_chatlist_sort_alphabetically">Sort Alphabetically</string> + <string name="settings_chatlist_add_new_buffers_automatically">Add new chats automatically</string> + <string name="settings_chatlist_network">Network</string> + <string name="settings_chatlist_disable_decoration">Hide Status Buffer</string> + <string name="settings_chatlist_types">Chat Types</string> + <string name="settings_chatlist_show_channels">Show Channels</string> + <string name="settings_chatlist_show_queries">Show Queries</string> + <string name="settings_chatlist_activity">Activity</string> + <string name="settings_chatlist_hide_inactive_buffers">Hide Inactive Chats</string> + <string name="settings_chatlist_hide_inactive_networks">Hide Inactive Networks</string> <string name="settings_networkconfig_title">IRC Config</string> <string name="settings_networkconfig_ping_timeout">Ping Timeout Detection</string> @@ -36,4 +49,4 @@ <string name="settings_networkconfig_auto_who_delay">Minimum delay between requests</string> <string name="settings_networkconfig_auto_who_delay_unit">seconds</string> <string name="settings_networkconfig_standard_ctcp">Standard-Compliant CTCP behavior</string> -</resources> \ No newline at end of file +</resources> diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt index cafcc17dfd4a2137e329a0db8edf61a8f97faddf..1e8a3738f948b6a6d5ead32ef14b8c30bead8208 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt @@ -5,14 +5,13 @@ import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.protocol.Type import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig -import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.SignalProxy +import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject class BufferViewConfig constructor( bufferViewId: Int, - proxy: SignalProxy, - private val session: ISession + proxy: SignalProxy ) : SyncableObject(proxy, "BufferViewConfig"), IBufferViewConfig { override fun init() { renameObject("$_bufferViewId") @@ -20,8 +19,8 @@ class BufferViewConfig constructor( override fun toVariantMap(): QVariantMap = mapOf( "BufferList" to QVariant.of(initBufferList(), Type.QVariantList), - "RemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList), - "TemporarilyRemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList) + "RemovedBuffers" to QVariant.of(initRemovedBuffers(), Type.QVariantList), + "TemporarilyRemovedBuffers" to QVariant.of(initTemporarilyRemovedBuffers(), Type.QVariantList) ) + initProperties() override fun fromVariantMap(properties: QVariantMap) { @@ -29,13 +28,6 @@ class BufferViewConfig constructor( initSetRemovedBuffers(properties["RemovedBuffers"].valueOr(::emptyList)) initSetTemporarilyRemovedBuffers(properties["TemporarilyRemovedBuffers"].valueOr(::emptyList)) initSetProperties(properties) - - val bufferSyncer = session.bufferSyncer - if (bufferSyncer != null) { - for (info in bufferSyncer.bufferInfos()) { - handleBuffer(info, bufferSyncer) - } - } } override fun initBufferList(): QVariantList = _buffers.map { @@ -79,18 +71,16 @@ class BufferViewConfig constructor( } override fun initSetProperties(properties: QVariantMap) { - setBufferViewName(properties["bufferViewName"].valueOr(this::bufferViewName)) - setNetworkId(properties["networkId"].valueOr(this::networkId)) - setAddNewBuffersAutomatically( - properties["addNewBuffersAutomatically"].valueOr(this::addNewBuffersAutomatically) - ) - setSortAlphabetically(properties["sortAlphabetically"].valueOr(this::sortAlphabetically)) - setHideInactiveBuffers(properties["hideInactiveBuffers"].valueOr(this::hideInactiveBuffers)) - setHideInactiveNetworks(properties["hideInactiveNetworks"].valueOr(this::hideInactiveNetworks)) - setDisableDecoration(properties["disableDecoration"].valueOr(this::disableDecoration)) - setAllowedBufferTypes(properties["allowedBufferTypes"].valueOr { allowedBufferTypes().toInt() }) - setMinimumActivity(properties["minimumActivity"].valueOr { minimumActivity().toInt() }) - setShowSearch(properties["showSearch"].valueOr(this::showSearch)) + _bufferViewName = properties["bufferViewName"].valueOr(this::bufferViewName) + _networkId = properties["networkId"].valueOr(this::networkId) + _addNewBuffersAutomatically = properties["addNewBuffersAutomatically"].valueOr(this::addNewBuffersAutomatically) + _sortAlphabetically = properties["sortAlphabetically"].valueOr(this::sortAlphabetically) + _hideInactiveBuffers = properties["hideInactiveBuffers"].valueOr(this::hideInactiveBuffers) + _hideInactiveNetworks = properties["hideInactiveNetworks"].valueOr(this::hideInactiveNetworks) + _disableDecoration = properties["disableDecoration"].valueOr(this::disableDecoration) + _allowedBufferTypes = properties["allowedBufferTypes"].valueOr(this::allowedBufferTypes) + _minimumActivity = properties["minimumActivity"].valueOr(this::minimumActivity) + _showSearch = properties["showSearch"].valueOr(this::showSearch) } override fun addBuffer(bufferId: BufferId, pos: Int) { @@ -177,93 +167,125 @@ class BufferViewConfig constructor( fun removedBuffers(): Set<BufferId> = _removedBuffers fun temporarilyRemovedBuffers(): Set<BufferId> = _temporarilyRemovedBuffers + fun liveUpdates(): Observable<BufferViewConfig> = live_config + fun liveBuffers(): Observable<List<BufferId>> = live_buffers + fun liveRemovedBuffers(): Observable<Set<BufferId>> = live_removedBuffers + fun liveTemporarilyRemovedBuffers(): Observable<Set<BufferId>> = live_temporarilyRemovedBuffers + + fun copy(): BufferViewConfig { + val config = BufferViewConfig(this.bufferViewId(), SignalProxy.NULL) + config.fromVariantMap(toVariantMap()) + return config + } + override fun setAddNewBuffersAutomatically(addNewBuffersAutomatically: Boolean) { _addNewBuffersAutomatically = addNewBuffersAutomatically super.setAddNewBuffersAutomatically(addNewBuffersAutomatically) - live_config.onNext(this) } override fun setAllowedBufferTypes(bufferTypes: Int) { _allowedBufferTypes = Buffer_Type.of(bufferTypes.toShort()) super.setAllowedBufferTypes(bufferTypes) - live_config.onNext(this) } override fun setBufferViewName(bufferViewName: String) { _bufferViewName = bufferViewName super.setBufferViewName(bufferViewName) - live_config.onNext(this) } override fun setDisableDecoration(disableDecoration: Boolean) { _disableDecoration = disableDecoration super.setDisableDecoration(disableDecoration) - live_config.onNext(this) } override fun setHideInactiveBuffers(hideInactiveBuffers: Boolean) { _hideInactiveBuffers = hideInactiveBuffers super.setHideInactiveBuffers(hideInactiveBuffers) - live_config.onNext(this) } override fun setHideInactiveNetworks(hideInactiveNetworks: Boolean) { _hideInactiveNetworks = hideInactiveNetworks super.setHideInactiveNetworks(hideInactiveNetworks) - live_config.onNext(this) } override fun setMinimumActivity(activity: Int) { _minimumActivity = Buffer_Activity.of(activity) super.setMinimumActivity(activity) - live_config.onNext(this) } override fun setNetworkId(networkId: NetworkId) { _networkId = networkId super.setNetworkId(networkId) - live_config.onNext(this) } override fun setShowSearch(showSearch: Boolean) { _showSearch = showSearch super.setShowSearch(showSearch) - live_config.onNext(this) } override fun setSortAlphabetically(sortAlphabetically: Boolean) { _sortAlphabetically = sortAlphabetically super.setSortAlphabetically(sortAlphabetically) - live_config.onNext(this) } private val _bufferViewId: Int = bufferViewId private var _bufferViewName: String = "" + set(value) { + field = value + live_config.onNext(this) + } private var _networkId: NetworkId = 0 + set(value) { + field = value + live_config.onNext(this) + } private var _addNewBuffersAutomatically: Boolean = true + set(value) { + field = value + live_config.onNext(this) + } private var _sortAlphabetically: Boolean = true + set(value) { + field = value + live_config.onNext(this) + } private var _hideInactiveBuffers: Boolean = false + set(value) { + field = value + live_config.onNext(this) + } private var _hideInactiveNetworks: Boolean = false + set(value) { + field = value + live_config.onNext(this) + } private var _disableDecoration: Boolean = false + set(value) { + field = value + live_config.onNext(this) + } private var _allowedBufferTypes: Buffer_Types = Buffer_Type.of(*Buffer_Type.validValues) + set(value) { + field = value + live_config.onNext(this) + } private var _minimumActivity: Buffer_Activities = Buffer_Activities.of(0) + set(value) { + field = value + live_config.onNext(this) + } private var _showSearch: Boolean = false + set(value) { + field = value + live_config.onNext(this) + } private var _buffers: MutableList<BufferId> = mutableListOf() private var _removedBuffers: MutableSet<BufferId> = mutableSetOf() private var _temporarilyRemovedBuffers: MutableSet<BufferId> = mutableSetOf() - val live_config = BehaviorSubject.createDefault(this) - - val live_buffers: BehaviorSubject<List<BufferId>> = BehaviorSubject.createDefault<List<BufferId>>( - emptyList() - ) - - val live_removedBuffers: BehaviorSubject<Set<BufferId>> = BehaviorSubject.createDefault<Set<BufferId>>( - emptySet() - ) - - val live_temporarilyRemovedBuffers: BehaviorSubject<Set<BufferId>> = BehaviorSubject.createDefault<Set<BufferId>>( - emptySet() - ) + private val live_config = BehaviorSubject.createDefault(this) + private val live_buffers = BehaviorSubject.createDefault<List<BufferId>>(emptyList()) + private val live_removedBuffers = BehaviorSubject.createDefault<Set<BufferId>>(emptySet()) + private val live_temporarilyRemovedBuffers = BehaviorSubject.createDefault<Set<BufferId>>(emptySet()) object NameComparator : Comparator<BufferViewConfig> { override fun compare(a: BufferViewConfig?, b: BufferViewConfig?) = diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt index 3d479dc2242a112c7b39d5fbb799b744e3021997..158c500cd30b70388c220922d5df8928520b7422 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt @@ -3,14 +3,12 @@ package de.kuschku.libquassel.quassel.syncables import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewManager -import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.SignalProxy import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject class BufferViewManager constructor( - proxy: SignalProxy, - private val session: ISession + proxy: SignalProxy ) : SyncableObject(proxy, "BufferViewManager"), IBufferViewManager { override fun toVariantMap(): QVariantMap = mapOf( "BufferViewIds" to QVariant.of(initBufferViewIds(), Type.QVariantList) @@ -49,7 +47,7 @@ class BufferViewManager constructor( if (_bufferViewConfigs.contains(bufferViewConfigId)) return - addBufferViewConfig(BufferViewConfig(bufferViewConfigId, proxy, session)) + addBufferViewConfig(BufferViewConfig(bufferViewConfigId, proxy)) } override fun deleteBufferViewConfig(bufferViewConfigId: Int) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt index 3c557684324a3d5a21bff236b323700cdbc65645..aa7fe24736825fee162689dba2a2c46321d2988c 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt @@ -28,13 +28,13 @@ interface ISyncableObject { fun toVariantMap(): QVariantMap = emptyMap() } -inline fun ISyncableObject.SYNC(function: String, vararg arg: QVariant_) { +/*inline*/ fun ISyncableObject.SYNC(function: String, vararg arg: QVariant_) { // Don’t transmit calls back that we just got from the network if (initialized && proxy.shouldSync(className, objectName, function)) proxy.callSync(className, objectName, function, arg.toList()) } -inline fun ISyncableObject.REQUEST(function: String, vararg arg: QVariant_) { +/*inline*/ fun ISyncableObject.REQUEST(function: String, vararg arg: QVariant_) { // Don’t transmit calls back that we just got from the network if (initialized && proxy.shouldSync(className, objectName, function)) proxy.callSync(className, objectName, function, arg.toList()) 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 c566fd79b11bbf47257e0da514481c735e587483..fd6a46f21d40a6dc74594e5298813e5531870c84 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -39,7 +39,7 @@ class Session( override val aliasManager = AliasManager(this) override val backlogManager = BacklogManager(this, backlogStorage) - override val bufferViewManager = BufferViewManager(this, this) + override val bufferViewManager = BufferViewManager(this) override val bufferSyncer = BufferSyncer(this, this) override val certManagers = mutableMapOf<IdentityId, CertManager>() override val coreInfo = CoreInfo(this) @@ -191,6 +191,11 @@ class Session( } override fun onInitDone() { + for (config in bufferViewManager.bufferViewConfigs()) { + for (info in bufferSyncer.bufferInfos()) { + config.handleBuffer(info, bufferSyncer) + } + } coreConnection.setState(ConnectionState.CONNECTED) dispatch(SignalProxyMessage.HeartBeat(Instant.now())) } diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt index 2e620768182343b0d3becf2c551d3e9494fd4c1d..4d3b89ce7f6625293463b438473e57bebf649fd6 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -318,6 +318,14 @@ class QuasselViewModel : ViewModel() { } }.mapOrElse(emptyList()) + val bufferViewConfigMap = bufferViewManager.switchMap { + it.map { manager -> + manager.liveBufferViewConfigs().map { + it.mapNotNull(manager::bufferViewConfig).associateBy(BufferViewConfig::bufferViewId) + } + }.orElse(Observable.empty()) + } + val showHidden = BehaviorSubject.createDefault(false) val collapsedNetworks = BehaviorSubject.createDefault(emptySet<NetworkId>()) val selectedBufferId = BehaviorSubject.createDefault(-1) @@ -381,14 +389,14 @@ class QuasselViewModel : ViewModel() { val config = configOptional.orNull() if (bufferSyncer != null && config != null) { session.liveNetworks().switchMap { networks -> - config.live_config + config.liveUpdates() .debounce(16, TimeUnit.MILLISECONDS) .switchMap { currentConfig -> combineLatest<Collection<BufferId>>( listOf( - config.live_buffers, - config.live_temporarilyRemovedBuffers, - config.live_removedBuffers + config.liveBuffers(), + config.liveTemporarilyRemovedBuffers(), + config.liveRemovedBuffers() ) ).switchMap { (ids, temp, perm) -> fun transformIds(ids: Collection<BufferId>, state: BufferHiddenState) =