davidliu

Fill in missing controls for view based example

@@ -16,6 +16,8 @@ import com.xwray.groupie.GroupieAdapter @@ -16,6 +16,8 @@ import com.xwray.groupie.GroupieAdapter
16 import io.livekit.android.room.track.Track 16 import io.livekit.android.room.track.Track
17 import io.livekit.android.room.track.VideoTrack 17 import io.livekit.android.room.track.VideoTrack
18 import io.livekit.android.sample.databinding.CallActivityBinding 18 import io.livekit.android.sample.databinding.CallActivityBinding
  19 +import io.livekit.android.sample.dialog.showDebugMenuDialog
  20 +import io.livekit.android.sample.dialog.showSelectAudioDeviceDialog
19 import io.livekit.android.util.flow 21 import io.livekit.android.util.flow
20 import kotlinx.coroutines.flow.* 22 import kotlinx.coroutines.flow.*
21 import kotlinx.parcelize.Parcelize 23 import kotlinx.parcelize.Parcelize
@@ -177,6 +179,24 @@ class CallActivity : AppCompatActivity() { @@ -177,6 +179,24 @@ class CallActivity : AppCompatActivity() {
177 } 179 }
178 180
179 binding.exit.setOnClickListener { finish() } 181 binding.exit.setOnClickListener { finish() }
  182 +
  183 + // Controls row 2
  184 + binding.audioSelect.setOnClickListener {
  185 + showSelectAudioDeviceDialog(viewModel)
  186 + }
  187 + lifecycleScope.launchWhenCreated {
  188 + viewModel.permissionAllowed.collect { allowed ->
  189 + val resource = if (allowed) R.drawable.account_cancel_outline else R.drawable.account_cancel
  190 + binding.permissions.setImageResource(resource)
  191 + }
  192 + }
  193 + binding.permissions.setOnClickListener {
  194 + viewModel.toggleSubscriptionPermissions()
  195 + }
  196 +
  197 + binding.debugMenu.setOnClickListener {
  198 + showDebugMenuDialog(viewModel)
  199 + }
180 } 200 }
181 201
182 override fun onResume() { 202 override fun onResume() {
  1 +package io.livekit.android.sample.dialog
  2 +
  3 +import android.R
  4 +import android.app.Activity
  5 +import android.app.AlertDialog
  6 +import android.widget.ArrayAdapter
  7 +import io.livekit.android.sample.CallViewModel
  8 +
  9 +
  10 +fun Activity.showDebugMenuDialog(callViewModel: CallViewModel) {
  11 + val builder = with(AlertDialog.Builder(this)) {
  12 + setTitle("Debug Menu")
  13 +
  14 + val arrayAdapter = ArrayAdapter<String>(this@showDebugMenuDialog, R.layout.select_dialog_item)
  15 + arrayAdapter.add("Simulate Migration")
  16 + arrayAdapter.add("Reconnect to Room")
  17 + setAdapter(arrayAdapter) { dialog, index ->
  18 + when (index) {
  19 + 0 -> callViewModel.simulateMigration()
  20 + 1 -> callViewModel.reconnect()
  21 + }
  22 + dialog.dismiss()
  23 + }
  24 + }
  25 + builder.show()
  26 +}
  1 +package io.livekit.android.sample.dialog
  2 +
  3 +import android.R
  4 +import android.app.Activity
  5 +import android.app.AlertDialog
  6 +import android.widget.ArrayAdapter
  7 +import io.livekit.android.sample.CallViewModel
  8 +
  9 +
  10 +fun Activity.showSelectAudioDeviceDialog(callViewModel: CallViewModel) {
  11 + val builder = with(AlertDialog.Builder(this)) {
  12 + setTitle("Select Audio Device")
  13 +
  14 + val audioHandler = callViewModel.audioHandler
  15 + val audioDevices = audioHandler.availableAudioDevices
  16 + val arrayAdapter = ArrayAdapter<String>(this@showSelectAudioDeviceDialog, R.layout.select_dialog_item)
  17 + arrayAdapter.addAll(audioDevices.map { it.name })
  18 + setAdapter(arrayAdapter) { dialog, index ->
  19 + audioHandler.selectDevice(audioDevices[index])
  20 + dialog.dismiss()
  21 + }
  22 + }
  23 + builder.show()
  24 +}
@@ -70,54 +70,105 @@ @@ -70,54 +70,105 @@
70 android:layout_height="60dp" 70 android:layout_height="60dp"
71 android:gravity="center" 71 android:gravity="center"
72 android:orientation="horizontal" 72 android:orientation="horizontal"
73 - app:layout_constraintBottom_toBottomOf="parent"> 73 + app:layout_constraintBottom_toTopOf="@id/controls_box2">
74 74
75 <ImageView 75 <ImageView
76 android:id="@+id/camera" 76 android:id="@+id/camera"
77 android:layout_width="@dimen/control_size" 77 android:layout_width="@dimen/control_size"
78 android:layout_height="@dimen/control_size" 78 android:layout_height="@dimen/control_size"
  79 + android:layout_weight="1"
79 android:background="?android:attr/selectableItemBackground" 80 android:background="?android:attr/selectableItemBackground"
80 android:padding="@dimen/control_padding" 81 android:padding="@dimen/control_padding"
81 - android:src="@drawable/outline_videocam_24" /> 82 + android:src="@drawable/outline_videocam_24"
  83 + app:tint="@android:color/white" />
82 84
83 <ImageView 85 <ImageView
84 android:id="@+id/mic" 86 android:id="@+id/mic"
85 android:layout_width="@dimen/control_size" 87 android:layout_width="@dimen/control_size"
86 android:layout_height="@dimen/control_size" 88 android:layout_height="@dimen/control_size"
  89 + android:layout_weight="1"
87 android:background="?android:attr/selectableItemBackground" 90 android:background="?android:attr/selectableItemBackground"
88 android:padding="@dimen/control_padding" 91 android:padding="@dimen/control_padding"
89 - android:src="@drawable/outline_mic_24" /> 92 + android:src="@drawable/outline_mic_24"
  93 + app:tint="@android:color/white" />
90 94
91 <ImageView 95 <ImageView
92 android:id="@+id/flip_camera" 96 android:id="@+id/flip_camera"
93 android:layout_width="@dimen/control_size" 97 android:layout_width="@dimen/control_size"
94 android:layout_height="@dimen/control_size" 98 android:layout_height="@dimen/control_size"
  99 + android:layout_weight="1"
95 android:background="?android:attr/selectableItemBackground" 100 android:background="?android:attr/selectableItemBackground"
96 android:padding="@dimen/control_padding" 101 android:padding="@dimen/control_padding"
97 - android:src="@drawable/outline_flip_camera_android_24" /> 102 + android:src="@drawable/outline_flip_camera_android_24"
  103 + app:tint="@android:color/white" />
98 104
99 <ImageView 105 <ImageView
100 android:id="@+id/screen_share" 106 android:id="@+id/screen_share"
101 android:layout_width="@dimen/control_size" 107 android:layout_width="@dimen/control_size"
102 android:layout_height="@dimen/control_size" 108 android:layout_height="@dimen/control_size"
  109 + android:layout_weight="1"
103 android:background="?android:attr/selectableItemBackground" 110 android:background="?android:attr/selectableItemBackground"
104 android:padding="@dimen/control_padding" 111 android:padding="@dimen/control_padding"
105 - android:src="@drawable/baseline_cast_24" /> 112 + android:src="@drawable/baseline_cast_24"
  113 + app:tint="@android:color/white" />
106 114
107 <ImageView 115 <ImageView
108 android:id="@+id/message" 116 android:id="@+id/message"
109 android:layout_width="@dimen/control_size" 117 android:layout_width="@dimen/control_size"
110 android:layout_height="@dimen/control_size" 118 android:layout_height="@dimen/control_size"
  119 + android:layout_weight="1"
111 android:background="?android:attr/selectableItemBackground" 120 android:background="?android:attr/selectableItemBackground"
112 android:padding="@dimen/control_padding" 121 android:padding="@dimen/control_padding"
113 - android:src="@drawable/baseline_chat_24" /> 122 + android:src="@drawable/baseline_chat_24"
  123 + app:tint="@android:color/white" />
114 124
115 <ImageView 125 <ImageView
116 android:id="@+id/exit" 126 android:id="@+id/exit"
117 android:layout_width="@dimen/control_size" 127 android:layout_width="@dimen/control_size"
118 android:layout_height="@dimen/control_size" 128 android:layout_height="@dimen/control_size"
  129 + android:layout_weight="1"
  130 + android:background="?android:attr/selectableItemBackground"
  131 + android:padding="@dimen/control_padding"
  132 + android:src="@drawable/ic_baseline_cancel_24"
  133 + app:tint="@android:color/white" />
  134 + </LinearLayout>
  135 +
  136 + <LinearLayout
  137 + android:id="@+id/controls_box2"
  138 + android:layout_width="match_parent"
  139 + android:layout_height="60dp"
  140 + android:gravity="center"
  141 + android:orientation="horizontal"
  142 + app:layout_constraintBottom_toBottomOf="parent">
  143 +
  144 + <ImageView
  145 + android:id="@+id/audio_select"
  146 + android:layout_width="@dimen/control_size"
  147 + android:layout_height="@dimen/control_size"
  148 + android:layout_weight="1"
  149 + android:background="?android:attr/selectableItemBackground"
  150 + android:padding="@dimen/control_padding"
  151 + android:src="@drawable/volume_up_48px"
  152 + app:tint="@android:color/white" />
  153 +
  154 + <ImageView
  155 + android:id="@+id/permissions"
  156 + android:layout_width="@dimen/control_size"
  157 + android:layout_height="@dimen/control_size"
  158 + android:layout_weight="1"
  159 + android:background="?android:attr/selectableItemBackground"
  160 + android:padding="@dimen/control_padding"
  161 + android:src="@drawable/account_cancel_outline"
  162 + app:tint="@android:color/white" />
  163 +
  164 + <ImageView
  165 + android:id="@+id/debug_menu"
  166 + android:layout_width="@dimen/control_size"
  167 + android:layout_height="@dimen/control_size"
  168 + android:layout_weight="1"
119 android:background="?android:attr/selectableItemBackground" 169 android:background="?android:attr/selectableItemBackground"
120 android:padding="@dimen/control_padding" 170 android:padding="@dimen/control_padding"
121 - android:src="@drawable/ic_baseline_cancel_24" /> 171 + android:src="@drawable/dots_horizontal_circle_outline"
  172 + app:tint="@android:color/white" />
122 </LinearLayout> 173 </LinearLayout>
123 </androidx.constraintlayout.widget.ConstraintLayout> 174 </androidx.constraintlayout.widget.ConstraintLayout>
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<Button xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:tools="http://schemas.android.com/tools"
  4 + android:id="@android:id/text1"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="wrap_content"
  7 + android:ellipsize="marquee"
  8 + android:gravity="center"
  9 + android:minHeight="?android:attr/listPreferredItemHeight"
  10 + android:textAppearance="?android:attr/textAppearanceLarge"
  11 + android:textColor="?android:attr/textColorAlertDialogListItem"
  12 + tools:text="Button" />