diff options
Diffstat (limited to 'android')
4 files changed, 78 insertions, 6 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt index 44d7e6c63a..b67c31e2a9 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt @@ -14,10 +14,13 @@ class RelayItemHolder( ) : ViewHolder(view) { private val name: TextView = view.findViewById(R.id.name) private val chevron: ImageButton = view.findViewById(R.id.chevron) + private val relayActive: View = view.findViewById(R.id.relay_active) + private val selectedIcon: View = view.findViewById(R.id.selected) private val countryColor = view.context.getColor(R.color.blue) private val cityColor = view.context.getColor(R.color.blue40) private val relayColor = view.context.getColor(R.color.blue20) + private val selectedColor = view.context.getColor(R.color.green) private val countryPadding = view.resources.getDimensionPixelSize(R.dimen.country_row_padding) private val cityPadding = view.resources.getDimensionPixelSize(R.dimen.city_row_padding) @@ -29,8 +32,15 @@ class RelayItemHolder( updateView() } + var selected = false + set(value) { + field = value + updateView() + } + init { chevron.setOnClickListener { toggle() } + view.setOnClickListener { adapter.selectItem(item, this) } } private fun updateView() { @@ -39,6 +49,14 @@ class RelayItemHolder( if (item != null) { name.text = item.name + if (selected) { + relayActive.visibility = View.INVISIBLE + selectedIcon.visibility = View.VISIBLE + } else { + relayActive.visibility = View.VISIBLE + selectedIcon.visibility = View.INVISIBLE + } + when (item.type) { RelayItemType.Country -> setViewStyle(countryColor, countryPadding) RelayItemType.City -> setViewStyle(cityColor, cityPadding) @@ -56,12 +74,17 @@ class RelayItemHolder( } } - private fun setViewStyle(backgroundColor: Int, padding: Int) { + private fun setViewStyle(rowColor: Int, padding: Int) { + var backgroundColor = rowColor val paddingLeft = padding val paddingTop = view.paddingTop val paddingRight = view.paddingRight val paddingBottom = view.paddingBottom + if (selected) { + backgroundColor = selectedColor + } + view.apply { setBackgroundColor(backgroundColor) setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt index e422f47eff..2725013719 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt @@ -12,6 +12,8 @@ import net.mullvad.mullvadvpn.R class RelayListAdapter : Adapter<RelayItemHolder>() { private val relayList = fakeRelayList private val activeIndices = LinkedList<WeakReference<RelayListAdapterPosition>>() + private var selectedItem: RelayItem? = null + private var selectedItemHolder: RelayItemHolder? = null override fun onCreateViewHolder(parentView: ViewGroup, type: Int): RelayItemHolder { val inflater = LayoutInflater.from(parentView.context) @@ -31,8 +33,7 @@ class RelayListAdapter : Adapter<RelayItemHolder>() { when (itemOrCount) { is GetItemResult.Item -> { - holder.item = itemOrCount.item - holder.itemPosition.position = position + bindHolderToItem(holder, itemOrCount.item, position) return } is GetItemResult.Count -> remaining -= itemOrCount.count @@ -42,6 +43,14 @@ class RelayListAdapter : Adapter<RelayItemHolder>() { override fun getItemCount() = relayList.map { country -> country.visibleItemCount }.sum() + fun selectItem(item: RelayItem?, holder: RelayItemHolder?) { + selectedItemHolder?.selected = false + + selectedItem = item + selectedItemHolder = holder + selectedItemHolder?.apply { selected = true } + } + fun expandItem(itemIndex: RelayListAdapterPosition, childCount: Int) { val position = itemIndex.position @@ -73,6 +82,18 @@ class RelayListAdapter : Adapter<RelayItemHolder>() { } } } + + private fun bindHolderToItem(holder: RelayItemHolder, item: RelayItem, position: Int) { + holder.item = item + holder.itemPosition.position = position + + if (selectedItem != null && selectedItem == item) { + holder.selected = true + selectedItemHolder = holder + } else { + holder.selected = false + } + } } val fakeRelayList = listOf( diff --git a/android/src/main/res/drawable/icon_tick.xml b/android/src/main/res/drawable/icon_tick.xml new file mode 100644 index 0000000000..5a4831dd94 --- /dev/null +++ b/android/src/main/res/drawable/icon_tick.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + > + <group> + <path android:fillColor="#FFFFFF" + android:pathData="M2.92646877,10.7979185 C2.25699855,10.1340272 1.17157288,10.1340272 0.502102661,10.7979185 C-0.167367554,11.4618098 -0.167367554,12.5381902 0.502102661,13.2020815 L7.35924552,20.0020815 C8.02871573,20.6659728 9.11414141,20.6659728 9.78361162,20.0020815 L23.4978973,6.40208153 C24.1673676,5.73819023 24.1673676,4.66180977 23.4978973,3.99791847 C22.8284271,3.33402718 21.7430014,3.33402718 21.0735312,3.99791847 L8.57142857,16.3958369 L2.92646877,10.7979185 Z" + /> + </group> +</vector> diff --git a/android/src/main/res/layout/relay_list_item.xml b/android/src/main/res/layout/relay_list_item.xml index 82b9b4ea41..29ebf56762 100644 --- a/android/src/main/res/layout/relay_list_item.xml +++ b/android/src/main/res/layout/relay_list_item.xml @@ -10,12 +10,26 @@ android:orientation="horizontal" android:gravity="center" > - <ImageView + <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" - android:src="@drawable/icon_relay_active" - /> + android:gravity="center" + > + <ImageView android:id="@+id/relay_active" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0" + android:src="@drawable/icon_relay_active" + /> + <ImageView android:id="@+id/selected" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0" + android:src="@drawable/icon_tick" + android:visibility="invisible" + /> + </FrameLayout> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" |
