From 2683b16bbdfd98f52e4cb13b70e86de36e1bae09 Mon Sep 17 00:00:00 2001 From: gmorell Date: Wed, 30 Dec 2020 23:29:15 -0500 Subject: [PATCH] Timer to query for Machines from the network + Link listener + deserialization, viewmodel passing --- .../io/gmp/does/lambent/droid/LambentDTOs.kt | 53 ++++++-- .../gmp/does/lambent/droid/LinkListAdapter.kt | 6 +- .../lambent/droid/ui/main/MainFragment.kt | 62 +++++---- .../lambent/droid/ui/main/MainViewModel.kt | 127 ++++++------------ .../main/res/layout/fragment_tab_devices.xml | 19 ++- .../main/res/layout/fragment_tab_links.xml | 2 +- .../main/res/layout/fragment_tab_machines.xml | 2 +- app/src/main/res/layout/main_fragment.xml | 34 ++--- gradle/wrapper/gradle-wrapper.properties | 4 +- 9 files changed, 148 insertions(+), 161 deletions(-) diff --git a/app/src/main/java/io/gmp/does/lambent/droid/LambentDTOs.kt b/app/src/main/java/io/gmp/does/lambent/droid/LambentDTOs.kt index 4a65ec7..7f65741 100644 --- a/app/src/main/java/io/gmp/does/lambent/droid/LambentDTOs.kt +++ b/app/src/main/java/io/gmp/does/lambent/droid/LambentDTOs.kt @@ -2,6 +2,26 @@ package io.gmp.does.lambent.droid import java.time.LocalDate +data class MachineQuery( + val machines: Map, + val speed_enum: Map +) { + companion object { + fun fromNetwork(map: Map) = object { + val machines = map["machines"] as Map> + val machines_ds = machines.map { + it.key to Machine.fromNetwork(it.value) + }.toMap() + val speed_enum = map["speed_enum"] as Map + + val data = MachineQuery( + machines = machines_ds, + speed_enum = speed_enum + ) + }.data + } +} + data class Machine( val name: String, val running: RunningEnum, @@ -19,7 +39,14 @@ data class Machine( val speed: String by map val iname: String? by map - val data = Machine(name, RunningEnum.valueOf(running), id, desc, TickEnum.valueOf(speed), iname) + val data = Machine( + name, + RunningEnum.valueOf(running), + id, + desc, + TickEnum.valueOf(speed), + iname + ) }.data } } @@ -45,25 +72,25 @@ data class Device( } data class LinkSpecSrc( - val listname: String, + val list_name: String, val ttl: String, val id: String, val cls: String ) { companion object { fun fromNetwork(map: Map) = object { - val listname: String by map + val list_name: String by map val ttl: String by map val id: String by map val cls: String by map - val data = LinkSpecSrc(listname, ttl, id, cls) + val data = LinkSpecSrc(list_name, ttl, id, cls) }.data } } data class LinkSpecTgt( - val listname: String, + val list_name: String, val grp: String, val iname: String, val id: String, @@ -71,13 +98,13 @@ data class LinkSpecTgt( ) { companion object { fun fromNetwork(map: Map) = object { - val listname: String by map + val list_name: String by map val grp: String by map val iname: String by map val id: String by map val name: String by map - val data = LinkSpecTgt(listname, grp, iname, id, name) + val data = LinkSpecTgt(list_name, grp, iname, id, name) }.data } } @@ -120,26 +147,26 @@ data class Link( class LinkSrc( - val listname: String, + val list_name: String, val ttl: String, val id: String, val cls: String ) { companion object { fun fromNetwork(map: Map) = object { - val listname: String by map + val list_name: String by map val ttl: String by map val id: String by map val cls: String by map - val data = LinkSrc(listname, ttl, id, cls) + val data = LinkSrc(list_name, ttl, id, cls) }.data } } class LinkSink( - val listname: String, + val list_name: String, val grp: String, val iname: String, val id: String, @@ -147,13 +174,13 @@ class LinkSink( ) { companion object { fun fromNetwork(map: Map) = object { - val listname: String by map + val list_name: String by map val grp: String by map val iname: String by map val id: String by map val name: String by map - val data = LinkSink(listname, grp, iname, id, name) + val data = LinkSink(list_name, grp, iname, id, name) }.data } } \ No newline at end of file diff --git a/app/src/main/java/io/gmp/does/lambent/droid/LinkListAdapter.kt b/app/src/main/java/io/gmp/does/lambent/droid/LinkListAdapter.kt index 6d155f1..0ed20b2 100644 --- a/app/src/main/java/io/gmp/does/lambent/droid/LinkListAdapter.kt +++ b/app/src/main/java/io/gmp/does/lambent/droid/LinkListAdapter.kt @@ -49,7 +49,7 @@ class LinkMainViewHolder internal constructor(inflater: LayoutInflater, parent: Toast.makeText(parent.context, "RM Clicked", Toast.LENGTH_SHORT).show() } toggle.setOnCheckedChangeListener { buttonView: CompoundButton, isChecked: Boolean -> - Toast.makeText(parent.context, "Toggle Clicked {$isChecked}", Toast.LENGTH_SHORT).show() +// Toast.makeText(parent.context, "Toggle Clicked {$isChecked}", Toast.LENGTH_SHORT).show() } } @@ -57,8 +57,8 @@ class LinkMainViewHolder internal constructor(inflater: LayoutInflater, parent: fun bind(device: Link) { item = device label_name.text = device.list_name - label_from.text = device.full_spec.source.listname - label_to.text = device.full_spec.target.listname + label_from.text = device.full_spec.source.list_name + label_to.text = device.full_spec.target.list_name toggle.isChecked = device.active } diff --git a/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainFragment.kt b/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainFragment.kt index 08e8034..07d837a 100644 --- a/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainFragment.kt +++ b/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainFragment.kt @@ -1,14 +1,14 @@ package io.gmp.does.lambent.droid.ui.main -import androidx.lifecycle.ViewModelProviders import android.os.Bundle -import androidx.fragment.app.Fragment +import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.databinding.DataBindingUtil -import androidx.lifecycle.Observer +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter @@ -19,7 +19,6 @@ import io.gmp.does.lambent.droid.* import kotlinx.android.synthetic.main.fragment_tab_devices.* import kotlinx.android.synthetic.main.fragment_tab_links.* import kotlinx.android.synthetic.main.fragment_tab_machines.* -import kotlinx.android.synthetic.main.main_fragment.* val Labels = listOf( "Devices", @@ -33,6 +32,7 @@ private const val ARG_ID = "id" private const val ARG_OBJECT = "object" class DemoCollectionAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + lateinit var viewModel: MainViewModel override fun getItemCount(): Int = Labels.size // lateinit var fragment: Fragment @@ -40,9 +40,9 @@ class DemoCollectionAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) override fun createFragment(position: Int): Fragment = // Return a NEW fragment instance in createFragment(int) when (position) { - 0 -> DeviceListFragment() - 1 -> MachineListFragment() - 2 -> LinkListFragment() + 0 -> DeviceListFragment().also { it.viewModel = viewModel } + 1 -> MachineListFragment().also { it.viewModel = viewModel } + 2 -> LinkListFragment().also { it.viewModel = viewModel } else -> DemoObjectFragment() } @@ -79,14 +79,26 @@ class MainFragment : Fragment() { binding.viewModel = viewModel // trying here - device_recycler = view.findViewById(R.id.device_recycler) - val device_list_adapter = DeviceListAdapter(viewModel) - device_recycler.layoutManager = LinearLayoutManager(context) - device_recycler.adapter = device_list_adapter +// device_recycler = view.findViewById(R.id.device_recycler) +// val device_list_adapter = DeviceListAdapter(viewModel) +// device_recycler.layoutManager = LinearLayoutManager(context) +// device_recycler.adapter = device_list_adapter + + // for the viewpager + commandCollectionAdapter = DemoCollectionAdapter(this) + commandCollectionAdapter.viewModel = viewModel + + // to update the machines + val handler = Handler() + val delay = 10000L // 10000 milliseconds == 10 second + handler.postDelayed(object : Runnable { + override fun run() { + println("myHandler: here!") // Do your work here + viewModel.machine_collector(viewModel.session) + handler.postDelayed(this, delay) + } + }, delay) -// viewModel.list_devices_l_t.observe(this, Observer { -// log {"observed change $it.length"} -// }) return view } @@ -99,14 +111,13 @@ class MainFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) -// commandCollectionAdapter = DemoCollectionAdapter(this) -// viewPager = view.findViewById(R.id.tab_pager) -// viewPager.adapter = commandCollectionAdapter -// -// tabLayout = view.findViewById(R.id.tab_layout) -// TabLayoutMediator(tabLayout, viewPager) { tab, position -> -// tab.text = Labels[position] -// }.attach() + viewPager = view.findViewById(R.id.tab_pager) + viewPager.adapter = commandCollectionAdapter + + tabLayout = view.findViewById(R.id.tab_layout) + TabLayoutMediator(tabLayout, viewPager) { tab, position -> + tab.text = Labels[position] + }.attach() } @@ -122,7 +133,6 @@ class DeviceListFragment : Fragment() { savedInstanceState: Bundle? ): View { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_tab_devices, container, false) - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) val view: View = binding.root binding.lifecycleOwner = this binding.viewModel = viewModel @@ -131,7 +141,7 @@ class DeviceListFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val device_list_adapter = DeviceListAdapter(viewModel) -// device_list_adapter.setDevices(viewModel.list_devices_l_t.value!!) + device_list_adapter.setDevices(viewModel.list_devices_l_t.value!!) device_recycler.layoutManager = LinearLayoutManager(context) device_recycler.adapter = device_list_adapter @@ -152,7 +162,6 @@ class MachineListFragment : Fragment() { savedInstanceState: Bundle? ): View { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_tab_machines, container, false) - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) val view: View = binding.root binding.lifecycleOwner = this binding.viewModel = viewModel @@ -161,7 +170,7 @@ class MachineListFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val device_list_adapter = MachineListAdapter() - device_list_adapter.setMachines(viewModel.list_machines.values.toList()) + device_list_adapter.setMachines(viewModel.list_machined_l_t.value!!) machine_recycler.layoutManager = LinearLayoutManager(context) machine_recycler.adapter = device_list_adapter } @@ -177,7 +186,6 @@ class LinkListFragment : Fragment() { savedInstanceState: Bundle? ): View { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_tab_links, container, false) - viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) val view: View = binding.root binding.lifecycleOwner = this binding.viewModel = viewModel diff --git a/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainViewModel.kt b/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainViewModel.kt index 3c5f024..d2c8508 100644 --- a/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/gmp/does/lambent/droid/ui/main/MainViewModel.kt @@ -1,16 +1,12 @@ package io.gmp.does.lambent.droid.ui.main import android.app.Application -import android.app.PendingIntent.getActivity import android.content.Context import android.view.View import android.widget.AdapterView -import android.widget.ImageButton import androidx.databinding.* import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import io.crossbar.autobahn.wamp.Client import io.crossbar.autobahn.wamp.Session @@ -19,6 +15,7 @@ import io.crossbar.autobahn.websocket.types.WebSocketOptions import io.gmp.does.lambent.droid.* import java.util.concurrent.CompletableFuture + val POSITION_TO_BRIGHTNESS = mapOf( 0 to 0, 1 to 3, @@ -84,74 +81,8 @@ open class MainViewModel(application: Application) : AndroidViewModel(applicatio // var list_devices_l_t: MutableLiveData> = MutableLiveData() var list_devices_l_t = MutableLiveData>() - - fun list_machines_rl(): List { - return listOf( - Machine( - name = "SolidStep", - running = RunningEnum.RUNNING, - id = "blah", - desc = "fff", - speed = TickEnum.MINS, - iname = "StaticRuby" - ), - Machine( - name = "SolidStep", - running = RunningEnum.RUNNING, - id = "blah", - desc = "fff", - speed = TickEnum.ONES, - iname = "StaticEmerald" - ), - Machine( - name = "SolidStep", - running = RunningEnum.RUNNING, - id = "blah", - desc = "fff", - speed = TickEnum.TWENTYS, - iname = "StaticSapphire" - ) - ) - } - - fun list_links_rl(): List { - return listOf( - Link( - "StubbyGlow", active = true, list_name = "StubbyGlow", full_spec = LinkSpec( - source = LinkSpecSrc( - listname = "StaticRuby", - ttl = "", - id = "", - cls = "SolidStep" - ), - target = LinkSpecTgt( - listname = "GlowBed", - grp = "8266", - iname = "GlowBed", - id = "", - name = "192.168.13.66" - ) - ) - ), - Link( - "FranticGloom", active = false, list_name = "FranticGloom", full_spec = LinkSpec( - source = LinkSpecSrc( - listname = "StaticEmerald", - ttl = "", - id = "", - cls = "SolidStep" - ), - target = LinkSpecTgt( - listname = "Doorway", - grp = "8266", - iname = "Doorway", - id = "", - name = "192.168.13.68" - ) - ) - ) - ) - } + var list_machined_l_t = MutableLiveData>() + var list_links_l_t = MutableLiveData>() companion object { @@ -212,7 +143,8 @@ open class MainViewModel(application: Application) : AndroidViewModel(applicatio list_devices_l_t.value = emptyList() -// list_devices_l_t.postValue(emptyList()) + list_machined_l_t.value = emptyList() + list_links_l_t.value = emptyList() } fun brightness_listener(args: List, kwargs: Map, details: EventDetails) { @@ -224,25 +156,31 @@ open class MainViewModel(application: Application) : AndroidViewModel(applicatio } fun link_listener(args: List, kwargs: Map, details: EventDetails) { -// log { "Got Link Update" } -// log { kwargs.toString() } + log { "Got Link Update" } + log { kwargs.toString() } // log { details.toString() } val links = kwargs.get("links") as Map> val sinks = kwargs.get("sinks") as List> val srcs = kwargs.get("srcs") as List> - for ((key: String, entry: Map) in links) { - list_links[key] = Link.fromNetwork(entry) - } - for (entry in sinks) { - val s = LinkSink.fromNetwork(entry) - list_sinks[s.id] = s - } - - for (entry in srcs) { - val s = LinkSrc.fromNetwork(entry) - list_srcs[s.id] = s - } +// for ((key: String, entry: Map) in links) { +// list_links[key] = Link.fromNetwork(entry) +// } + log { links.map{it.key to Link.fromNetwork(it.value)}.toMap().toMutableMap().toString() } + list_links = links.map{it.key to Link.fromNetwork(it.value)}.toMap().toMutableMap() +// list_sinks = sinks.map{it.key to LinkSink.fromNetwork(it.value)}.toMap().toMutableMap() +// for (entry in sinks) { +// val s = LinkSink.fromNetwork(entry) +// list_sinks[s.id] = s +// } +// +// for (entry in srcs) { +// val s = LinkSrc.fromNetwork(entry) +// list_srcs[s.id] = s +// } + log {"wew"} + list_links_l_t.value = list_links.values.toList() + log {"lad"} notifyChange() } @@ -265,6 +203,21 @@ open class MainViewModel(application: Application) : AndroidViewModel(applicatio log { list_devices.toString() } } + fun machine_collector(session: Session) { + log { "Collecting Machines" } + + session.call("com.lambentri.edge.la4.machine.list").thenAccept { it -> + log { "Collected" } + val machine_result = MachineQuery.fromNetwork(it.results.get(0) as Map) + for (entry: Machine in machine_result.machines.values) { + list_machines[entry.id] = entry + } + list_machined_l_t.value = list_machines.values.toList() + notifyChange() + } + } + + fun add_subscriptions(session: Session, details: SessionDetails) { val brightnessControlFuture: CompletableFuture = session.subscribe( "com.lambentri.edge.la4.machine.gb", diff --git a/app/src/main/res/layout/fragment_tab_devices.xml b/app/src/main/res/layout/fragment_tab_devices.xml index 81edc69..958d138 100644 --- a/app/src/main/res/layout/fragment_tab_devices.xml +++ b/app/src/main/res/layout/fragment_tab_devices.xml @@ -1,6 +1,5 @@ @@ -14,14 +13,14 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tab_links.xml b/app/src/main/res/layout/fragment_tab_links.xml index 25f7751..2df829f 100644 --- a/app/src/main/res/layout/fragment_tab_links.xml +++ b/app/src/main/res/layout/fragment_tab_links.xml @@ -22,7 +22,7 @@ android:gravity="center" android:padding="8dp" tools:listitem="@layout/devices_item" - app:items_links="@{viewModel.list_links_rl}" + app:items_links="@{viewModel.list_links_l_t}" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tab_machines.xml b/app/src/main/res/layout/fragment_tab_machines.xml index 571b097..e4a8a65 100644 --- a/app/src/main/res/layout/fragment_tab_machines.xml +++ b/app/src/main/res/layout/fragment_tab_machines.xml @@ -22,7 +22,7 @@ android:gravity="center" android:padding="8dp" tools:listitem="@layout/devices_item" - app:items_machines="@{viewModel.list_machines_rl}" + app:items_machines="@{viewModel.list_machined_l_t}" /> \ No newline at end of file diff --git a/app/src/main/res/layout/main_fragment.xml b/app/src/main/res/layout/main_fragment.xml index 962018e..98a05a9 100644 --- a/app/src/main/res/layout/main_fragment.xml +++ b/app/src/main/res/layout/main_fragment.xml @@ -161,25 +161,25 @@ /> - - - - + - - - - - - + android:layout_height="wrap_content" + android:layout_weight="1" /> + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bceeef1..c4a9e50 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Nov 11 18:27:22 EST 2020 +#Wed Dec 30 19:58:52 EST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip