summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemHolder.kt25
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListAdapter.kt25
-rw-r--r--android/src/main/res/drawable/icon_tick.xml14
-rw-r--r--android/src/main/res/layout/relay_list_item.xml20
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"