From 741153b47da8d374d62bb81c1c10190a079293c0 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Wed, 17 Apr 2019 20:12:17 +0200 Subject: [PATCH] Improve FAB join menu --- .../chat/add/{create => }/NetworkAdapter.kt | 2 +- .../ui/chat/add/{create => }/NetworkItem.kt | 2 +- .../chat/add/create/ChannelCreateActivity.kt | 16 +- .../chat/add/create/ChannelCreateFragment.kt | 19 +- .../ui/chat/add/join/ChannelJoinActivity.kt | 16 +- .../ui/chat/add/join/ChannelJoinFragment.kt | 78 ++++++++ .../ui/chat/add/query/QueryCreateActivity.kt | 16 +- .../chat/buffers/BufferViewConfigFragment.kt | 185 +++++++++--------- app/src/main/res/layout/add_join.xml | 77 ++++++-- 9 files changed, 289 insertions(+), 122 deletions(-) rename app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/{create => }/NetworkAdapter.kt (98%) rename app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/{create => }/NetworkItem.kt (94%) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt similarity index 98% rename from app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt index 512c396d4..8ce027f86 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkAdapter.kt @@ -17,7 +17,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid.ui.chat.add.create +package de.kuschku.quasseldroid.ui.chat.add import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt similarity index 94% rename from app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt rename to app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt index 7a2341bdd..b978fb187 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/NetworkItem.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/NetworkItem.kt @@ -17,7 +17,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid.ui.chat.add.create +package de.kuschku.quasseldroid.ui.chat.add import de.kuschku.libquassel.protocol.NetworkId diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt index b7a982e4e..aabff7772 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateActivity.kt @@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.create import android.content.Context import android.content.Intent +import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity class ChannelCreateActivity : ServiceBoundSettingsActivity(ChannelCreateFragment()) { companion object { - fun launch(context: Context) = context.startActivity(intent(context)) - fun intent(context: Context) = Intent(context, ChannelCreateActivity::class.java) + fun launch( + context: Context, + networkId: NetworkId? = null + ) = context.startActivity(intent(context, networkId)) + + fun intent( + context: Context, + networkId: NetworkId? = null + ) = Intent(context, ChannelCreateActivity::class.java).apply { + if (networkId != null) { + putExtra("network_id", networkId.id) + } + } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt index b07ef1f86..e3baf6fb1 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/create/ChannelCreateFragment.kt @@ -38,6 +38,8 @@ import de.kuschku.libquassel.util.helpers.nullIf import de.kuschku.libquassel.util.helpers.value import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.ui.chat.ChatActivity +import de.kuschku.quasseldroid.ui.chat.add.NetworkAdapter +import de.kuschku.quasseldroid.ui.chat.add.NetworkItem import de.kuschku.quasseldroid.util.helper.combineLatest import de.kuschku.quasseldroid.util.helper.setDependent import de.kuschku.quasseldroid.util.helper.toLiveData @@ -79,21 +81,30 @@ class ChannelCreateFragment : ServiceBoundSettingsFragment() { val view = inflater.inflate(R.layout.add_create, container, false) ButterKnife.bind(this, view) + val networkId = NetworkId(arguments?.getInt("network_id", 0) ?: 0) + val networkAdapter = NetworkAdapter() network.adapter = networkAdapter + var hasSetNetwork = false modelHelper.networks.switchMap { combineLatest(it.values.map(Network::liveNetworkInfo)).map { it.map { - NetworkItem( - it.networkId, - it.networkName - ) + NetworkItem(it.networkId, it.networkName) }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, NetworkItem::name)) } }.toLiveData().observe(this, Observer { if (it != null) { networkAdapter.submitList(it) + if (!hasSetNetwork && networkId.isValidId() && it.isNotEmpty()) { + network.post { + val index = networkAdapter.indexOf(networkId) + if (index != null) { + network.setSelection(index) + } + } + hasSetNetwork = true + } } }) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt index 22a5fb7cb..ebc1d5e6b 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinActivity.kt @@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.join import android.content.Context import android.content.Intent +import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity class ChannelJoinActivity : ServiceBoundSettingsActivity(ChannelJoinFragment()) { companion object { - fun launch(context: Context) = context.startActivity(intent(context)) - fun intent(context: Context) = Intent(context, ChannelJoinActivity::class.java) + fun launch( + context: Context, + networkId: NetworkId? = null + ) = context.startActivity(intent(context, networkId)) + + fun intent( + context: Context, + networkId: NetworkId? = null + ) = Intent(context, ChannelJoinActivity::class.java).apply { + if (networkId != null) { + putExtra("network_id", networkId.id) + } + } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt index 0785d1c61..a9184d268 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/join/ChannelJoinFragment.kt @@ -23,17 +23,95 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import androidx.appcompat.widget.AppCompatSpinner +import androidx.lifecycle.Observer +import butterknife.BindView import butterknife.ButterKnife +import de.kuschku.libquassel.protocol.Buffer_Type +import de.kuschku.libquassel.protocol.NetworkId +import de.kuschku.libquassel.quassel.syncables.Network +import de.kuschku.libquassel.util.helpers.value import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.chat.ChatActivity +import de.kuschku.quasseldroid.ui.chat.add.NetworkAdapter +import de.kuschku.quasseldroid.ui.chat.add.NetworkItem +import de.kuschku.quasseldroid.util.helper.combineLatest +import de.kuschku.quasseldroid.util.helper.toLiveData import de.kuschku.quasseldroid.util.service.ServiceBoundFragment +import de.kuschku.quasseldroid.viewmodel.helper.QuasselViewModelHelper +import javax.inject.Inject class ChannelJoinFragment : ServiceBoundFragment() { + @BindView(R.id.network) + lateinit var network: AppCompatSpinner + + @BindView(R.id.name) + lateinit var name: EditText + + @BindView(R.id.join) + lateinit var join: Button + + @Inject + lateinit var modelHelper: QuasselViewModelHelper override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.add_join, container, false) ButterKnife.bind(this, view) + val networkId = NetworkId(arguments?.getInt("network_id", 0) ?: 0) + + val networkAdapter = NetworkAdapter() + network.adapter = networkAdapter + + var hasSetNetwork = false + modelHelper.networks.switchMap { + combineLatest(it.values.map(Network::liveNetworkInfo)).map { + it.map { + NetworkItem(it.networkId, it.networkName) + }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, NetworkItem::name)) + } + }.toLiveData().observe(this, Observer { + if (it != null) { + networkAdapter.submitList(it) + if (!hasSetNetwork && networkId.isValidId() && it.isNotEmpty()) { + network.post { + val index = networkAdapter.indexOf(networkId) + if (index != null) { + network.setSelection(index) + } + } + hasSetNetwork = true + } + } + }) + + join.setOnClickListener { + join.setText(R.string.label_saving) + join.isEnabled = false + + val networkId = NetworkId(network.selectedItemId.toInt()) + val channelName = name.text.toString().trim() + + modelHelper.bufferSyncer.value?.orNull()?.let { bufferSyncer -> + bufferSyncer.find( + networkId = networkId, + type = Buffer_Type.of(Buffer_Type.StatusBuffer) + )?.let { statusBuffer -> + modelHelper.session.value?.orNull()?.rpcHandler?.apply { + sendInput(statusBuffer, "/join $channelName") + } + } + } + + activity?.let { + it.finish() + ChatActivity.launch(it, networkId = networkId, channel = channelName) + } + } + return view } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt index 7c20d2d07..ab4f880fb 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/add/query/QueryCreateActivity.kt @@ -21,11 +21,23 @@ package de.kuschku.quasseldroid.ui.chat.add.query import android.content.Context import android.content.Intent +import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity class QueryCreateActivity : ServiceBoundSettingsActivity(QueryCreateFragment()) { companion object { - fun launch(context: Context) = context.startActivity(intent(context)) - fun intent(context: Context) = Intent(context, QueryCreateActivity::class.java) + fun launch( + context: Context, + networkId: NetworkId? = null + ) = context.startActivity(intent(context, networkId)) + + fun intent( + context: Context, + networkId: NetworkId? = null + ) = Intent(context, QueryCreateActivity::class.java).apply { + if (networkId != null) { + putExtra("network_id", networkId.id) + } + } } } 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 7292f2878..2b9874b35 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 @@ -311,14 +311,16 @@ class BufferViewConfigFragment : ServiceBoundFragment() { getColor(0, 0) } + var chatListState: Parcelable? = savedInstanceState?.getParcelable(KEY_STATE_LIST) var hasRestoredChatListState = false listAdapter.setOnUpdateFinishedListener { - if (!hasRestoredChatListState && it.isNotEmpty()) { + if (it.isNotEmpty()) { chatList.layoutManager?.let { - savedInstanceState?.getParcelable<Parcelable>(KEY_STATE_LIST) - ?.let(it::onRestoreInstanceState) + if (chatListState != null) { + it.onRestoreInstanceState(chatListState) + hasRestoredChatListState = true + } } - hasRestoredChatListState = true } } @@ -335,76 +337,74 @@ class BufferViewConfigFragment : ServiceBoundFragment() { modelHelper.selectedBuffer, database.filtered().listenRx(accountId).toObservable(), accountDatabase.accounts().listenDefaultFiltered(accountId, 0).toObservable() - ).toLiveData().observe(this, Observer { it -> - it?.let { (info, expandedNetworks, selected, filteredList, defaultFiltered) -> - runInBackground { - val (config, list) = info ?: Pair(null, emptyList()) - val minimumActivity = config?.minimumActivity() ?: Buffer_Activity.NONE - val activities = filteredList.associate { it.bufferId to it.filtered.toUInt() } - val processedList = list.asSequence().sortedBy { props -> - !props.info.type.hasFlag(Buffer_Type.StatusBuffer) - }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { props -> - props.network.networkName - }).map { props -> - val activity = props.activity - (activities[props.info.bufferId] - ?: defaultFiltered?.toUInt() - ?: 0u) - BufferListItem( - props.copy( - activity = activity, - description = ircFormatDeserializer.formatString( - props.description.toString(), - colorize = messageSettings.colorizeMirc - ), - bufferActivity = Buffer_Activity.of( - when { - props.highlights > 0 -> Buffer_Activity.Highlight - activity.hasFlag(Message_Type.Plain) || - activity.hasFlag(Message_Type.Notice) || - activity.hasFlag(Message_Type.Action) -> Buffer_Activity.NewMessage - activity.isNotEmpty() -> Buffer_Activity.OtherActivity - else -> Buffer_Activity.NoActivity - } - ), - fallbackDrawable = if (props.info.type.hasFlag(Buffer_Type.QueryBuffer)) { - props.ircUser?.let { - val nickName = it.nick() - val useSelfColor = when (messageSettings.colorizeNicknames) { - MessageSettings.ColorizeNicknamesMode.ALL -> false - MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE -> - props.ircUser?.network()?.isMyNick(nickName) == true - MessageSettings.ColorizeNicknamesMode.NONE -> true - } - - colorContext.buildTextDrawable(it.nick(), useSelfColor) - } ?: colorContext.buildTextDrawable("", colorAway) - } else { - val color = if (props.bufferStatus == BufferStatus.ONLINE) colorAccent - else colorAway - - colorContext.buildTextDrawable("#", color) - }, - avatarUrls = props.ircUser?.let { - AvatarHelper.avatar(messageSettings, it, avatarSize) - } ?: emptyList() - ), - BufferState( - networkExpanded = expandedNetworks[props.network.networkId] - ?: (props.networkConnectionState == INetwork.ConnectionState.Initialized), - selected = selected.info?.bufferId == props.info.bufferId - ) - ) - }.filter { (props, state) -> - (props.info.type.hasFlag(BufferInfo.Type.StatusBuffer) || state.networkExpanded) && - (minimumActivity.toInt() <= props.bufferActivity.toInt() || - props.info.type.hasFlag(Buffer_Type.StatusBuffer)) - }.toList() - - activity?.runOnUiThread { - listAdapter.submitList(processedList) - } - } + ).map { (info, expandedNetworks, selected, filteredList, defaultFiltered) -> + val (config, list) = info ?: Pair(null, emptyList()) + val minimumActivity = config?.minimumActivity() ?: Buffer_Activity.NONE + val activities = filteredList.associate { it.bufferId to it.filtered.toUInt() } + list.asSequence().sortedBy { props -> + !props.info.type.hasFlag(Buffer_Type.StatusBuffer) + }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { props -> + props.network.networkName + }).map { props -> + val activity = props.activity - (activities[props.info.bufferId] + ?: defaultFiltered?.toUInt() + ?: 0u) + BufferListItem( + props.copy( + activity = activity, + description = ircFormatDeserializer.formatString( + props.description.toString(), + colorize = messageSettings.colorizeMirc + ), + bufferActivity = Buffer_Activity.of( + when { + props.highlights > 0 -> Buffer_Activity.Highlight + activity.hasFlag(Message_Type.Plain) || + activity.hasFlag(Message_Type.Notice) || + activity.hasFlag(Message_Type.Action) -> Buffer_Activity.NewMessage + activity.isNotEmpty() -> Buffer_Activity.OtherActivity + else -> Buffer_Activity.NoActivity + } + ), + fallbackDrawable = if (props.info.type.hasFlag(Buffer_Type.QueryBuffer)) { + props.ircUser?.let { + val nickName = it.nick() + val useSelfColor = when (messageSettings.colorizeNicknames) { + MessageSettings.ColorizeNicknamesMode.ALL -> false + MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE -> + props.ircUser?.network()?.isMyNick(nickName) == true + MessageSettings.ColorizeNicknamesMode.NONE -> true + } + + colorContext.buildTextDrawable(it.nick(), useSelfColor) + } ?: colorContext.buildTextDrawable("", colorAway) + } else { + val color = if (props.bufferStatus == BufferStatus.ONLINE) colorAccent + else colorAway + + colorContext.buildTextDrawable("#", color) + }, + avatarUrls = props.ircUser?.let { + AvatarHelper.avatar(messageSettings, it, avatarSize) + } ?: emptyList() + ), + BufferState( + networkExpanded = expandedNetworks[props.network.networkId] + ?: (props.networkConnectionState == INetwork.ConnectionState.Initialized), + selected = selected.info?.bufferId == props.info.bufferId + ) + ) + }.filter { (props, state) -> + (props.info.type.hasFlag(BufferInfo.Type.StatusBuffer) || state.networkExpanded) && + (minimumActivity.toInt() <= props.bufferActivity.toInt() || + props.info.type.hasFlag(Buffer_Type.StatusBuffer)) + }.toList() + }.toLiveData().observe(this, Observer { processedList -> + if (hasRestoredChatListState) { + chatListState = chatList.layoutManager?.onSaveInstanceState() + hasRestoredChatListState = false } + listAdapter.submitList(processedList) }) listAdapter.setOnClickListener(this@BufferViewConfigFragment::clickListener) listAdapter.setOnLongClickListener(this@BufferViewConfigFragment::longClickListener) @@ -501,9 +501,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() { else -> false } } - chatList.layoutManager = object : LinearLayoutManager(context) { - override fun supportsPredictiveItemAnimations() = false - } + chatList.layoutManager = LinearLayoutManager(context) chatList.itemAnimator = DefaultItemAnimator() chatList.setItemViewCacheSize(10) @@ -554,7 +552,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() { @ColorInt var fabBackground2 = 0 view.context.theme.styledAttributes( R.attr.colorTextPrimary, R.attr.colorBackgroundCard, - R.attr.senderColorF, R.attr.senderColorE, R.attr.senderColorD + R.attr.senderColorE, R.attr.senderColorD, R.attr.senderColorC ) { colorLabel = getColor(0, 0) colorLabelBackground = getColor(1, 0) @@ -574,17 +572,17 @@ class BufferViewConfigFragment : ServiceBoundFragment() { .create() ) - if (BuildConfig.DEBUG) { - fab.addActionItem( - SpeedDialActionItem.Builder(R.id.fab_join, R.drawable.ic_channel) - .setFabBackgroundColor(fabBackground1) - .setFabImageTintColor(0xffffffffu.toInt()) - .setLabel(R.string.label_join_long) - .setLabelBackgroundColor(colorLabelBackground) - .setLabelColor(colorLabel) - .create() - ) + fab.addActionItem( + SpeedDialActionItem.Builder(R.id.fab_join, R.drawable.ic_channel) + .setFabBackgroundColor(fabBackground1) + .setFabImageTintColor(0xffffffffu.toInt()) + .setLabel(R.string.label_join_long) + .setLabelBackgroundColor(colorLabelBackground) + .setLabelColor(colorLabel) + .create() + ) + if (BuildConfig.DEBUG) { fab.addActionItem( SpeedDialActionItem.Builder(R.id.fab_query, R.drawable.ic_account) .setFabBackgroundColor(fabBackground2) @@ -597,19 +595,26 @@ class BufferViewConfigFragment : ServiceBoundFragment() { } fab.setOnActionSelectedListener { + val networkId = modelHelper.bufferData?.value?.network?.networkId() when (it.id) { R.id.fab_query -> { - context?.let(QueryCreateActivity.Companion::launch) + context?.let { + QueryCreateActivity.launch(it, networkId = networkId) + } fab.close(false) true } R.id.fab_join -> { - context?.let(ChannelJoinActivity.Companion::launch) + context?.let { + ChannelJoinActivity.launch(it, networkId = networkId) + } fab.close(false) true } R.id.fab_create -> { - context?.let(ChannelCreateActivity.Companion::launch) + context?.let { + ChannelCreateActivity.launch(it, networkId = networkId) + } fab.close(false) true } diff --git a/app/src/main/res/layout/add_join.xml b/app/src/main/res/layout/add_join.xml index c409cbfc5..6b039888c 100644 --- a/app/src/main/res/layout/add_join.xml +++ b/app/src/main/res/layout/add_join.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> + <!-- Quasseldroid - Quassel client for Android @@ -22,32 +23,68 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - android:padding="16dp"> + android:orientation="vertical"> - <de.kuschku.ui.spinner.MaterialSpinnerLayout - style="@style/Widget.CustomSpinnerLayout" + <FrameLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/label_network"> + android:layout_height="0dip" + android:layout_weight="1"> - <androidx.appcompat.widget.AppCompatSpinner - android:id="@+id/network" - style="@style/Widget.MaterialSpinner" + <androidx.core.widget.NestedScrollView android:layout_width="match_parent" - android:layout_height="wrap_content" - tools:listitem="@layout/widget_spinner_item_material" /> - </de.kuschku.ui.spinner.MaterialSpinnerLayout> + android:layout_height="match_parent"> + + <LinearLayout style="@style/Widget.CoreSettings.Wrapper"> + + <de.kuschku.ui.spinner.MaterialSpinnerLayout + style="@style/Widget.CustomSpinnerLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/label_network"> + + <androidx.appcompat.widget.AppCompatSpinner + android:id="@+id/network" + style="@style/Widget.MaterialSpinner" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:listitem="@layout/widget_spinner_item_material" /> + </de.kuschku.ui.spinner.MaterialSpinnerLayout> - <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.CustomTextInput" + <com.google.android.material.textfield.TextInputLayout + style="@style/Widget.CustomTextInput" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="@string/label_channel_name"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/name" + style="@style/Widget.CoreSettings.EditText" + tools:text="#trees" /> + </com.google.android.material.textfield.TextInputLayout> + </LinearLayout> + </androidx.core.widget.NestedScrollView> + + <de.kuschku.quasseldroid.util.ui.view.ShadowView + android:layout_width="match_parent" + android:layout_height="@dimen/shadow_height" + android:layout_gravity="bottom" + android:gravity="bottom" /> + </FrameLayout> + + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/settings_aliasitem_name"> + android:gravity="end" + android:paddingLeft="16dp" + android:paddingTop="4dp" + android:paddingRight="16dp" + android:paddingBottom="4dp"> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/name" - style="@style/Widget.CoreSettings.EditText" - tools:text="back" /> - </com.google.android.material.textfield.TextInputLayout> + <com.google.android.material.button.MaterialButton + android:id="@+id/join" + style="@style/Widget.Button.Colored" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/label_join" /> + </LinearLayout> </LinearLayout> -- GitLab