diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ceb73f876948518700daf6ace1e7ffd1305ab1f..353a7e6903a4d048921ae72ee4807e4dc23855b7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,13 +62,25 @@ android:parentActivityName=".ui.chat.ChatActivity" android:windowSoftInputMode="adjustResize" /> <activity - android:name=".ui.coresettings.identity.IdentityActivity" + android:name=".ui.coresettings.identity.IdentityCreateActivity" android:exported="false" android:label="@string/settings_identity_title" android:parentActivityName=".ui.coresettings.CoreSettingsActivity" android:windowSoftInputMode="adjustResize" /> <activity - android:name=".ui.coresettings.chatlist.ChatListActivity" + android:name=".ui.coresettings.identity.IdentityEditActivity" + android:exported="false" + android:label="@string/settings_identity_title" + android:parentActivityName=".ui.coresettings.CoreSettingsActivity" + android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.coresettings.chatlist.ChatlistCreateActivity" + android:exported="false" + android:label="@string/settings_chatlist_title" + android:parentActivityName=".ui.coresettings.CoreSettingsActivity" + android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.coresettings.chatlist.ChatlistEditActivity" android:exported="false" android:label="@string/settings_chatlist_title" android:parentActivityName=".ui.coresettings.CoreSettingsActivity" 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 1f8d98d5c74701190e33680611a93a6854fc5108..50e08e1553d125c79d9c8547990eab1daf839443 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt @@ -22,10 +22,14 @@ 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.chatlist.ChatlistCreateActivity +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatlistCreateFragmentProvider +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatlistEditActivity +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatlistEditFragmentProvider +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityCreateActivity +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityCreateFragmentProvider +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityEditActivity +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityEditFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.ignoreitem.IgnoreItemActivity import de.kuschku.quasseldroid.ui.coresettings.ignoreitem.IgnoreItemFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.ignorelist.IgnoreListActivity @@ -67,11 +71,17 @@ abstract class ActivityModule { @ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class]) abstract fun bindCoreSettingsActivity(): CoreSettingsActivity - @ContributesAndroidInjector(modules = [IdentityFragmentProvider::class]) - abstract fun bindIdentityActivity(): IdentityActivity + @ContributesAndroidInjector(modules = [IdentityCreateFragmentProvider::class]) + abstract fun bindIdentityCreateActivity(): IdentityCreateActivity - @ContributesAndroidInjector(modules = [ChatListFragmentProvider::class]) - abstract fun bindChatListActivity(): ChatListActivity + @ContributesAndroidInjector(modules = [IdentityEditFragmentProvider::class]) + abstract fun bindIdentityEditActivity(): IdentityEditActivity + + @ContributesAndroidInjector(modules = [ChatlistCreateFragmentProvider::class]) + abstract fun bindChatListCreateActivity(): ChatlistCreateActivity + + @ContributesAndroidInjector(modules = [ChatlistEditFragmentProvider::class]) + abstract fun bindChatListEditActivity(): ChatlistEditActivity @ContributesAndroidInjector(modules = [IgnoreListFragmentProvider::class]) abstract fun bindIgnoreActivity(): IgnoreListActivity diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt index 63fbb4182388ac65dcd0b74b27fc12a66eb4fd89..a4b20a53f0ec497384e4fd26b412be9176d8ea87 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt @@ -98,9 +98,11 @@ class BufferViewConfigFragment : ServiceBoundFragment() { session.bufferSyncer?.requestRemoveBuffer(info.bufferId) } } + .onAny { _, _ -> + actionMode?.finish() + } .build() .show() - actionMode?.finish() true } R.id.action_rename -> { @@ -119,9 +121,11 @@ class BufferViewConfigFragment : ServiceBoundFragment() { .negativeColorAttr(R.attr.colorTextPrimary) .backgroundColorAttr(R.attr.colorBackgroundCard) .contentColorAttr(R.attr.colorTextPrimary) + .onAny { _, _ -> + actionMode?.finish() + } .build() .show() - actionMode?.finish() true } R.id.action_unhide -> { diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt index 90656dd37f2e496b866f3c0b8adc1b101405c12f..c68b8e0c25eebbca7cdc77566827a90e5e0adbfe 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt @@ -24,7 +24,7 @@ import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer import de.kuschku.quasseldroid.viewmodel.EditorViewModel import javax.inject.Inject -class TopicFragment : SettingsFragment() { +class TopicFragment : SettingsFragment(), SettingsFragment.Savable { @BindView(R.id.chatline) lateinit var chatline: RichEditText 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 8a800c24deb91e81fcb61cb86b37464e06913efc..f9f6d54e0e09e338914022d47ea6c7a7ca7c2595 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 @@ -9,14 +9,17 @@ import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button import butterknife.BindView import butterknife.ButterKnife 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.chatlist.ChatlistCreateActivity +import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatlistEditActivity +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityCreateActivity +import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityEditActivity import de.kuschku.quasseldroid.ui.coresettings.ignorelist.IgnoreListActivity import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity import de.kuschku.quasseldroid.util.helper.combineLatest @@ -27,12 +30,21 @@ class CoreSettingsFragment : ServiceBoundFragment() { @BindView(R.id.networks) lateinit var networks: RecyclerView + @BindView(R.id.new_network) + lateinit var newNetwork: Button + @BindView(R.id.identities) lateinit var identities: RecyclerView + @BindView(R.id.new_identity) + lateinit var newIdentity: Button + @BindView(R.id.chatlists) lateinit var chatlists: RecyclerView + @BindView(R.id.new_chatlist) + lateinit var newChatlist: Button + @BindView(R.id.ignorelist) lateinit var ignorelist: View @@ -59,11 +71,11 @@ class CoreSettingsFragment : ServiceBoundFragment() { } val identityAdapter = SettingsItemAdapter { - IdentityActivity.launch(requireContext(), identity = it) + IdentityEditActivity.launch(requireContext(), identity = it) } val chatListAdapter = SettingsItemAdapter { - ChatListActivity.launch(requireContext(), chatlist = it) + ChatlistEditActivity.launch(requireContext(), chatlist = it) } val itemDecoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) @@ -121,6 +133,18 @@ class CoreSettingsFragment : ServiceBoundFragment() { IgnoreListActivity.launch(requireContext()) } + newNetwork.setOnClickListener { + // + } + + newIdentity.setOnClickListener { + IdentityCreateActivity.launch(requireContext()) + } + + newChatlist.setOnClickListener { + ChatlistCreateActivity.launch(requireContext()) + } + return view } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt index 76e93128abd0963f985da773533cedd441a7db1e..9aa7fcd9b882c5575f16f381f1c5938c98f57ffd 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/SettingsFragment.kt @@ -4,27 +4,65 @@ import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import com.afollestad.materialdialogs.MaterialDialog import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.util.service.ServiceBoundFragment abstract class SettingsFragment : ServiceBoundFragment() { + private var saveable: Savable? = null + private var deletable: Deletable? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) + saveable = this as? Savable + deletable = this as? Deletable } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { inflater?.inflate(R.menu.context_setting, menu) + menu?.findItem(R.id.action_save)?.isVisible = saveable != null + menu?.findItem(R.id.action_delete)?.isVisible = deletable != null super.onCreateOptionsMenu(menu, inflater) } override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { - R.id.action_save -> { - if (onSave()) activity?.finish() + R.id.action_save -> { + saveable?.let { + if (it.onSave()) activity?.finish() + } + true + } + R.id.action_delete -> { + deletable?.let { + MaterialDialog.Builder(activity!!) + .content(R.string.delete_confirmation) + .positiveText(R.string.label_yes) + .negativeText(R.string.label_no) + .negativeColorAttr(R.attr.colorTextPrimary) + .backgroundColorAttr(R.attr.colorBackgroundCard) + .contentColorAttr(R.attr.colorTextPrimary) + .onPositive { _, _ -> + it.onDelete() + requireActivity().finish() + } + .build() + .show() + } true } - else -> super.onOptionsItemSelected(item) + else -> super.onOptionsItemSelected(item) + } + + interface Changeable { + fun hasChanged(): Boolean + } + + interface Savable { + fun onSave(): Boolean } - abstract fun onSave(): Boolean -} \ No newline at end of file + interface Deletable { + fun onDelete() + } +} 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/ChatListBaseFragment.kt similarity index 84% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListBaseFragment.kt index 72326304dfb0c406e3d57ff68f83ea9dead57b7e..cffea51bdae43bba1f04782d3b681b1d4783fbbf 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListBaseFragment.kt @@ -25,8 +25,9 @@ import de.kuschku.quasseldroid.util.helper.combineLatest import de.kuschku.quasseldroid.util.helper.toLiveData import io.reactivex.Observable -class ChatListFragment : SettingsFragment() { - private var chatlist: Pair<BufferViewConfig, BufferViewConfig>? = null +abstract class ChatListBaseFragment : SettingsFragment(), SettingsFragment.Savable, + SettingsFragment.Changeable { + protected var chatlist: Pair<BufferViewConfig?, BufferViewConfig>? = null @BindView(R.id.buffer_view_name) lateinit var bufferViewName: TextView @@ -152,7 +153,22 @@ class ChatListFragment : SettingsFragment() { return view } - override fun onSave() = chatlist?.let { (it, data) -> + override fun hasChanged() = chatlist?.let { (it, data) -> + applyChanges(data, it) + + it == null || + data.bufferViewName() != it.bufferViewName() || + data.showSearch() != it.showSearch() || + data.sortAlphabetically() != it.sortAlphabetically() || + data.addNewBuffersAutomatically() != it.addNewBuffersAutomatically() || + data.hideInactiveBuffers() != it.hideInactiveBuffers() || + data.hideInactiveNetworks() != it.hideInactiveNetworks() || + data.allowedBufferTypes() != it.allowedBufferTypes() || + data.networkId() != it.networkId() || + data.minimumActivity() != it.minimumActivity() + } ?: false + + protected fun applyChanges(data: BufferViewConfig, old: BufferViewConfig?) { data.setBufferViewName(bufferViewName.text.toString()) data.setShowSearch(showSearch.isChecked) data.setSortAlphabetically(sortAlphabetically.isChecked) @@ -173,11 +189,10 @@ class ChatListFragment : SettingsFragment() { data.setNetworkId(networkId.selectedItemId.toInt()) data.setMinimumActivity(minimumActivity.selectedItemId.toInt()) - data.initSetBufferList(it.initBufferList()) - data.initSetTemporarilyRemovedBuffers(it.initTemporarilyRemovedBuffers()) - data.initSetRemovedBuffers(it.initRemovedBuffers()) - - it.requestUpdate(data.toVariantMap()) - true - } ?: false + if (old != null) { + data.initSetBufferList(old.initBufferList()) + data.initSetTemporarilyRemovedBuffers(old.initTemporarilyRemovedBuffers()) + data.initSetRemovedBuffers(old.initRemovedBuffers()) + } + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListCreateFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListCreateFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..e6adf93aae473c9bc146800086b8dae0769a89ef --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListCreateFragment.kt @@ -0,0 +1,14 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import de.kuschku.libquassel.quassel.syncables.BufferViewConfig +import de.kuschku.libquassel.util.helpers.value + +class ChatListCreateFragment : ChatListBaseFragment() { + override fun onSave() = viewModel.session.value?.orNull()?.let { session -> + BufferViewConfig(-1, session.proxy).let { data -> + applyChanges(data, null) + viewModel.bufferViewManager.value?.orNull()?.requestCreateBufferView(data.toVariantMap()) + true + } + } ?: false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListEditFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListEditFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..931b3e3dbd5cfca7c859ce46637c3757b8cc2981 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListEditFragment.kt @@ -0,0 +1,20 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import de.kuschku.libquassel.util.helpers.value +import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment + +class ChatListEditFragment : ChatListBaseFragment(), SettingsFragment.Deletable { + override fun onSave() = chatlist?.let { (it, data) -> + applyChanges(data, it) + it?.requestUpdate(data.toVariantMap()) + true + } ?: false + + override fun onDelete() { + chatlist?.let { (it, _) -> + it?.let { + viewModel.bufferViewManager.value?.orNull()?.requestDeleteBufferView(it.bufferViewId()) + } + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..9f5c304df3f6609f072f5caba67e147e017d5f8e --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateActivity.kt @@ -0,0 +1,12 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import android.content.Context +import android.content.Intent +import de.kuschku.quasseldroid.util.ui.SettingsActivity + +class ChatlistCreateActivity : SettingsActivity(ChatListCreateFragment()) { + companion object { + fun launch(context: Context) = context.startActivity(intent(context)) + fun intent(context: Context) = Intent(context, ChatlistCreateActivity::class.java) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt new file mode 100644 index 0000000000000000000000000000000000000000..527726516ff7450334942f421c57315096c84174 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistCreateFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.coresettings.chatlist + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class ChatlistCreateFragmentProvider { + @ContributesAndroidInjector + abstract fun bindChatListCreateFragment(): ChatListCreateFragment +} 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/ChatlistEditActivity.kt similarity index 75% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt index 45a42e7b2914a3b3d99a4c7783dd58ab6b7232b3..07d9c196c4a8e3fb21bc98e9029ca54f84f4c729 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditActivity.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import de.kuschku.quasseldroid.util.ui.SettingsActivity -class ChatListActivity : SettingsActivity(ChatListFragment()) { +class ChatlistEditActivity : SettingsActivity(ChatListEditFragment()) { companion object { fun launch( context: Context, @@ -14,7 +14,7 @@ class ChatListActivity : SettingsActivity(ChatListFragment()) { fun intent( context: Context, chatlist: Int - ) = Intent(context, ChatListActivity::class.java).apply { + ) = Intent(context, ChatlistEditActivity::class.java).apply { putExtra("chatlist", chatlist) } } 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/ChatlistEditFragmentProvider.kt similarity index 60% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt index 033de4aae7ce9170fa81867ce449c41af0079abc..4ae8a0bda7ceb6c1ac1afa4e733774971151d944 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatlistEditFragmentProvider.kt @@ -4,7 +4,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector @Module -abstract class ChatListFragmentProvider { +abstract class ChatlistEditFragmentProvider { @ContributesAndroidInjector - abstract fun bindChatListFragment(): ChatListFragment + abstract fun bindChatListEditFragment(): ChatListEditFragment } 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/IdentityBaseFragment.kt similarity index 85% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityBaseFragment.kt index e3aa0a3b934e62ee58c6f57d6da345d29f67213e..1c57031734162537d0e264510eb1d1f508b7cf53 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/IdentityBaseFragment.kt @@ -23,8 +23,10 @@ import de.kuschku.quasseldroid.util.helper.toLiveData import io.reactivex.Observable -class IdentityFragment : SettingsFragment() { - private var identity: Pair<Identity, Identity>? = null +abstract class IdentityBaseFragment : SettingsFragment(), SettingsFragment.Savable, + SettingsFragment.Changeable { + + protected var identity: Pair<Identity?, Identity>? = null @BindView(R.id.identity_name) lateinit var identityName: TextView @@ -139,7 +141,23 @@ class IdentityFragment : SettingsFragment() { }.build().show() } - override fun onSave() = identity?.let { (it, data) -> + override fun hasChanged() = identity?.let { (it, data) -> + applyChanges(data) + + it == null || + data.identityName() != it.identityName() || + data.realName() != it.realName() || + data.ident() != it.ident() || + data.kickReason() != it.kickReason() || + data.partReason() != it.partReason() || + data.quitReason() != it.quitReason() || + data.awayReason() != it.awayReason() || + data.detachAwayEnabled() != it.detachAwayEnabled() || + data.detachAwayReason() != it.detachAwayReason() || + data.nicks() != it.nicks() + } ?: false + + protected fun applyChanges(data: Identity) { data.setIdentityName(identityName.text.toString()) data.setRealName(realName.text.toString()) data.setIdent(ident.text.toString()) @@ -150,9 +168,5 @@ class IdentityFragment : SettingsFragment() { data.setDetachAwayEnabled(detachAway.isChecked) data.setDetachAwayReason(detachAwayReason.text.toString()) data.setNicks(adapter.nicks) - - it.requestUpdate(data.toVariantMap()) - true - } ?: false - + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..f6a8239a68bf275951393986c4ed48bbeca746e4 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateActivity.kt @@ -0,0 +1,12 @@ +package de.kuschku.quasseldroid.ui.coresettings.identity + +import android.content.Context +import android.content.Intent +import de.kuschku.quasseldroid.util.ui.SettingsActivity + +class IdentityCreateActivity : SettingsActivity(IdentityCreateFragment()) { + companion object { + fun launch(context: Context) = context.startActivity(intent(context)) + fun intent(context: Context) = Intent(context, IdentityCreateActivity::class.java) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..b80b28970265ad2d53219afb7ba741313d8c7ed7 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragment.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid.ui.coresettings.identity + +import de.kuschku.libquassel.quassel.syncables.Identity +import de.kuschku.libquassel.util.helpers.value + + +class IdentityCreateFragment : IdentityBaseFragment() { + override fun onSave() = viewModel.session.value?.orNull()?.let { session -> + Identity(session.proxy).let { data -> + applyChanges(data) + session.rpcHandler?.requestCreateIdentity(data.toVariantMap(), mapOf()) + true + } + } ?: false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt new file mode 100644 index 0000000000000000000000000000000000000000..e73e4cfdbfc4dc3581559ed0abd75d6c75ff06d7 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityCreateFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.coresettings.identity + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class IdentityCreateFragmentProvider { + @ContributesAndroidInjector + abstract fun bindIdentityCreateFragment(): IdentityCreateFragment +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt similarity index 77% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityActivity.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt index b137bf1f61df11bfc653d96d94d4aee8234cdf68..c9ec38bdb0a7252b793aaa44538408125e322335 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditActivity.kt @@ -5,7 +5,7 @@ import android.content.Intent import de.kuschku.libquassel.protocol.IdentityId import de.kuschku.quasseldroid.util.ui.SettingsActivity -class IdentityActivity : SettingsActivity(IdentityFragment()) { +class IdentityEditActivity : SettingsActivity(IdentityEditFragment()) { companion object { fun launch( context: Context, @@ -15,7 +15,7 @@ class IdentityActivity : SettingsActivity(IdentityFragment()) { fun intent( context: Context, identity: IdentityId - ) = Intent(context, IdentityActivity::class.java).apply { + ) = Intent(context, IdentityEditActivity::class.java).apply { putExtra("identity", identity) } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..e8a5bdcc27fd08a26eb2a58f968eb06c6eedde93 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragment.kt @@ -0,0 +1,20 @@ +package de.kuschku.quasseldroid.ui.coresettings.identity + +import de.kuschku.libquassel.util.helpers.value +import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment + +class IdentityEditFragment : IdentityBaseFragment(), SettingsFragment.Deletable { + override fun onSave() = identity?.let { (it, data) -> + applyChanges(data) + it?.requestUpdate(data.toVariantMap()) + true + } ?: false + + override fun onDelete() { + identity?.let { (it, _) -> + it?.let { + viewModel.session.value?.orNull()?.rpcHandler?.requestRemoveIdentity(it.id()) + } + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt similarity index 60% rename from app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragmentProvider.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt index 1c156fbe756906402a3d9d4630392f20b73bc078..ec469d8489be67846cf2a5abf442fddd3bedc3eb 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragmentProvider.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityEditFragmentProvider.kt @@ -4,7 +4,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector @Module -abstract class IdentityFragmentProvider { +abstract class IdentityEditFragmentProvider { @ContributesAndroidInjector - abstract fun bindIdentityFragment(): IdentityFragment + abstract fun bindIdentityEditFragment(): IdentityEditFragment } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt index 90034f76ba9b336fe62c8a1a18617caf2fa8757f..3ac7edbb74b82733f1f5466845d0d30116c52d49 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt @@ -17,7 +17,8 @@ import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.util.ui.AnimationHelper -class IgnoreItemFragment : SettingsFragment() { +class IgnoreItemFragment : SettingsFragment(), SettingsFragment.Savable, + SettingsFragment.Changeable { @BindView(R.id.enabled) lateinit var enabled: SwitchCompat @@ -141,4 +142,13 @@ class IgnoreItemFragment : SettingsFragment() { true } + override fun hasChanged() = item != IgnoreListManager.IgnoreListItem( + isActive = enabled.isChecked, + ignoreRule = ignoreRule.text.toString(), + isRegEx = isRegEx.isChecked, + type = type.selectedItemId.toInt(), + strictness = strictness.selectedItemId.toInt(), + scope = scope.selectedItemId.toInt(), + scopeRule = scopeRule.text.toString() + ) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt index a30ac988769c7376e22ef2afe0e47734034a5a8d..08b5f5d17754e10fde0618cc4044f938850ece89 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt @@ -21,7 +21,8 @@ import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.ui.coresettings.ignoreitem.IgnoreItemActivity import de.kuschku.quasseldroid.util.helper.toLiveData -class IgnoreListFragment : SettingsFragment() { +class IgnoreListFragment : SettingsFragment(), SettingsFragment.Savable, + SettingsFragment.Changeable { @BindView(R.id.list) lateinit var list: RecyclerView @@ -96,11 +97,20 @@ class IgnoreListFragment : SettingsFragment() { } override fun onSave() = ignoreListManager?.let { (it, data) -> - data.setIgnoreList(adapter.list) + applyChanges(data) it.requestUpdate(data.toVariantMap()) true } ?: false + override fun hasChanged() = ignoreListManager?.let { (it, data) -> + applyChanges(data) + data != it + } ?: false + + private fun applyChanges(data: IgnoreListManager) { + data.setIgnoreList(adapter.list) + } + companion object { private const val REQUEST_UPDATE_RULE = 1 private const val REQUEST_CREATE_RULE = 2 diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt index ceac297b19045134c04b973e4f10b269d84a5738..e9367b3734eb9efb39751ab37fdaa7965fd20932 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/networkconfig/NetworkConfigFragment.kt @@ -16,7 +16,8 @@ import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.util.helper.setDependent import de.kuschku.quasseldroid.util.helper.toLiveData -class NetworkConfigFragment : SettingsFragment() { +class NetworkConfigFragment : SettingsFragment(), SettingsFragment.Savable, + SettingsFragment.Changeable { private var networkConfig: Pair<NetworkConfig, NetworkConfig>? = null @BindView(R.id.ping_timeout_enabled) @@ -84,6 +85,26 @@ class NetworkConfigFragment : SettingsFragment() { override fun onSave() = networkConfig?.let { (it, data) -> + applyChanges(data) + + it.requestUpdate(data.toVariantMap()) + true + } ?: false + + override fun hasChanged() = networkConfig?.let { (it, data) -> + applyChanges(data) + + data.pingTimeoutEnabled() != it.pingTimeoutEnabled() || + data.pingInterval() != it.pingInterval() || + data.maxPingCount() != it.maxPingCount() || + data.autoWhoEnabled() != it.autoWhoEnabled() || + data.autoWhoInterval() != it.autoWhoInterval() || + data.autoWhoNickLimit() != it.autoWhoNickLimit() || + data.autoWhoDelay() != it.autoWhoDelay() || + data.standardCtcp() != it.standardCtcp() + } ?: false + + private fun applyChanges(data: NetworkConfig) { data.setPingTimeoutEnabled(pingTimeoutEnabled.isChecked) pingInterval.text.toString().toIntOrNull()?.let(data::setPingInterval) maxPingCount.text.toString().toIntOrNull()?.let(data::setMaxPingCount) @@ -93,8 +114,5 @@ class NetworkConfigFragment : SettingsFragment() { autoWhoNickLimit.text.toString().toIntOrNull()?.let(data::setAutoWhoNickLimit) autoWhoDelay.text.toString().toIntOrNull()?.let(data::setAutoWhoDelay) data.setStandardCtcp(standardCtcp.isChecked) - - it.requestUpdate(data.toVariantMap()) - true - } ?: false + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt index 30b536ccf769050e253c6ffdf81000cc93972955..f3ec01f76d8655588f5ee95ad4ed61c3fa81f393 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/SettingsActivity.kt @@ -5,12 +5,16 @@ import android.support.v4.app.Fragment import android.support.v7.widget.Toolbar import butterknife.BindView import butterknife.ButterKnife +import com.afollestad.materialdialogs.MaterialDialog import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.util.service.ServiceBoundActivity abstract class SettingsActivity(private val fragment: Fragment? = null) : ServiceBoundActivity() { protected open fun fragment(): Fragment? = null + private var changeable: SettingsFragment.Changeable? = null + @BindView(R.id.toolbar) lateinit var toolbar: Toolbar @@ -31,5 +35,25 @@ abstract class SettingsActivity(private val fragment: Fragment? = null) : Servic transaction.replace(R.id.fragment_container, fragment) transaction.commit() } + + this.changeable = fragment as? SettingsFragment.Changeable + } + + override fun onBackPressed() { + val changeable = this.changeable + if (changeable?.hasChanged() == true) { + MaterialDialog.Builder(this) + .content(R.string.cancel_confirmation) + .positiveText(R.string.label_yes) + .negativeText(R.string.label_no) + .negativeColorAttr(R.attr.colorTextPrimary) + .backgroundColorAttr(R.attr.colorBackgroundCard) + .contentColorAttr(R.attr.colorTextPrimary) + .onPositive { _, _ -> + super.onBackPressed() + } + .build() + .show() + } else super.onBackPressed() } -} \ No newline at end of file +} diff --git a/app/src/main/res/menu/context_setting.xml b/app/src/main/res/menu/context_setting.xml index c167e748cc8f1e880eb40aecb8b6efc6763921c7..fbec4bd5c4f06f09e88f1e45bb8e706fef491943 100644 --- a/app/src/main/res/menu/context_setting.xml +++ b/app/src/main/res/menu/context_setting.xml @@ -5,4 +5,8 @@ android:id="@+id/action_save" android:title="@string/label_save" app:showAsAction="ifRoom" /> -</menu> \ No newline at end of file + <item + android:id="@+id/action_delete" + android:title="@string/label_delete" + app:showAsAction="ifRoom" /> +</menu> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9682b2c7bdee79ad816c0da28e4e945bccf77197..c0cddc5d112b4141fe848ccf5d9a2f67a2c40f2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,4 +79,7 @@ <string name="notification_channel_highlight_title">Highlight</string> <string name="buffer_delete_confirmation">Do you want to delete this buffer permanently?</string> + + <string name="delete_confirmation">Are you sure you want to delete this permanently? This can not be undone</string> + <string name="cancel_confirmation">You have unsaved changes. Do you wish to discard them?</string> </resources> 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 e02a481bfabe5c4ece1c9fd76ffb011bbeb20c24..0d9c3e25ff1f99d097c9c9768ece0ce8fff2f7d6 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 @@ -41,27 +41,47 @@ class RpcHandler( backlogStorage.storeMessages(session, message) } - override fun requestCreateIdentity(identity: QVariantMap, additional: QVariantMap) { - } - - override fun requestRemoveIdentity(identityId: IdentityId) { - } - - override fun requestCreateNetwork(networkInfo: INetwork.NetworkInfo, channels: List<String>) { - } - - override fun requestRemoveNetwork(networkId: NetworkId) { - } + override fun requestCreateIdentity(identity: QVariantMap, additional: QVariantMap) = + RPC( + "2requestCreateIdentity(Identity,QVariantMap)", + ARG(identity, QType.Identity), + ARG(additional, Type.QVariantMap) + ) + + override fun requestRemoveIdentity(identityId: IdentityId) = + RPC( + "2requestRemoveIdentity(IdentityId)", + ARG(identityId, QType.IdentityId) + ) + + override fun requestCreateNetwork(networkInfo: INetwork.NetworkInfo, channels: List<String>) = + RPC( + "2requestCreateNetwork(NetworkInfo,QStringList)", + ARG(networkInfo, QType.NetworkInfo), + ARG(channels, Type.QStringList) + ) + + override fun requestRemoveNetwork(networkId: NetworkId) = + RPC( + "2requestRemoveNetwork(NetworkId)", + ARG(networkId, QType.NetworkId) + ) override fun requestPasswordChange(peerPtr: Long, user: String, old: String, new: String) { } - override fun requestKickClient(id: Int) = RPC("2requestKickClient(Int)", ARG(id, Type.Int)) - - override fun sendInput(bufferInfo: BufferInfo, message: String) = RPC( - "2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo), - ARG(message, Type.QString) - ) + override fun requestKickClient(id: Int) = + RPC( + "2requestKickClient(Int)", + ARG(id, Type.Int) + ) + + override fun sendInput(bufferInfo: BufferInfo, message: String) = + RPC( + "2sendInput(BufferInfo,QString)", + ARG(bufferInfo, QType.BufferInfo), + ARG(message, Type.QString) + ) inline fun RPC(function: String, vararg arg: QVariant_) { // Don’t transmit calls back that we just got from the network 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 bdbdd4a8afdf5291e98e67e1e12a2e884cba9dbc..d35de1f701827863abd7a37459ebd68688980650 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt @@ -34,6 +34,8 @@ interface ISession : Closeable { val rpcHandler: RpcHandler? val initStatus: Observable<Pair<Int, Int>> + val proxy: SignalProxy + val error: Flowable<HandshakeMessage> val lag: Observable<Long> @@ -42,6 +44,7 @@ interface ISession : Closeable { companion object { val NULL = object : ISession { + override val proxy: SignalProxy = SignalProxy.NULL override val error = BehaviorSubject.create<HandshakeMessage>() .toFlowable(BackpressureStrategy.BUFFER) 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 23439087d6a7ea6be3e42cede53bfa4f2ed35cb0..ec0bb88eeea9c584eda08a7a37996da75b1da420 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -24,6 +24,7 @@ class Session( val disconnectFromCore: () -> Unit, exceptionHandler: (Throwable) -> Unit ) : ProtocolHandler(exceptionHandler), ISession { + override val proxy: SignalProxy = this override val features = Features(clientData.clientFeatures, QuasselFeatures.empty()) override val sslSession 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 86e9b29ba319a21b19ab79527b7304d8240ee66d..8332bff62858ee410049c79efb0a8742e6f938db 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -55,6 +55,7 @@ class QuasselViewModel : ViewModel() { val backend = backendWrapper.switchMap { it } val sessionManager = backend.mapMap(Backend::sessionManager) val session = sessionManager.mapSwitchMap(SessionManager::session) + val rpcHandler = session.mapMapNullable(ISession::rpcHandler) val connectionProgress = sessionManager.mapSwitchMap(SessionManager::connectionProgress) .mapOrElse(Triple(ConnectionState.DISCONNECTED, 0, 0))