map analytics optional

pull/28/head
geeksville 2020-04-11 13:20:30 -07:00
rodzic 838e61a97a
commit 042e8d6ebb
9 zmienionych plików z 826 dodań i 34 usunięć

Wyświetl plik

@ -34,6 +34,11 @@ android {
// We have to list all translated languages here, because some of our libs have bogus languages that google play // We have to list all translated languages here, because some of our libs have bogus languages that google play
// doesn't like and we need to strip them (gr) // doesn't like and we need to strip them (gr)
resConfigs "en", "de", "fi", "fr", "ga", "it", "nl", "ru", "sv", "zh" resConfigs "en", "de", "fi", "fr", "ga", "it", "nl", "ru", "sv", "zh"
// Needed to make mapbox work inside the firebase testlab - FIXME, alas, still doesn't work
ndk {
// abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
} }
buildFeatures { buildFeatures {

Wyświetl plik

@ -23,6 +23,7 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.geeksville.android.GeeksvilleApplication
import com.geeksville.android.Logging import com.geeksville.android.Logging
import com.geeksville.android.ServiceClient import com.geeksville.android.ServiceClient
import com.geeksville.mesh.model.Channel import com.geeksville.mesh.model.Channel
@ -262,15 +263,18 @@ class MainActivity : AppCompatActivity(), Logging,
} }
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val prefs = UIViewModel.getPreferences(this) val prefs = UIViewModel.getPreferences(this)
model.ownerName.value = prefs.getString("owner", "")!! model.ownerName.value = prefs.getString("owner", "")!!
val isInTestLab = (application as GeeksvilleApplication).isInTestLab
// Ensures Bluetooth is available on the device and it is enabled. If not, // Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth. // displays a dialog requesting user permission to enable Bluetooth.
if (bluetoothAdapter != null) { if (bluetoothAdapter != null && !isInTestLab) {
bluetoothAdapter!!.takeIf { !it.isEnabled }?.apply { bluetoothAdapter!!.takeIf { !it.isEnabled }?.apply {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT) startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
@ -284,8 +288,8 @@ class MainActivity : AppCompatActivity(), Logging,
.show() .show()
} }
requestPermission() if (isInTestLab)
requestPermission() // permissions don't work there
/* not yet working /* not yet working
// Configure sign-in to request the user's ID, email address, and basic // Configure sign-in to request the user's ID, email address, and basic

Wyświetl plik

@ -16,11 +16,11 @@ class MeshUtilApplication : GeeksvilleApplication() {
Logging.showLogs = BuildConfig.DEBUG Logging.showLogs = BuildConfig.DEBUG
// We default to off in the manifest, FIXME turn on only if user approves // We default to off in the manifest - we turn on here if the user approves
// leave off when running in the debugger // leave off when running in the debugger
if (!isEmulator && (!BuildConfig.DEBUG || !Debug.isDebuggerConnected())) { if (!isEmulator && (!BuildConfig.DEBUG || !Debug.isDebuggerConnected())) {
val crashlytics = FirebaseCrashlytics.getInstance() val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.setCrashlyticsCollectionEnabled(true) crashlytics.setCrashlyticsCollectionEnabled(isAnalyticsAllowed)
crashlytics.setCustomKey("debug_build", BuildConfig.DEBUG) crashlytics.setCustomKey("debug_build", BuildConfig.DEBUG)
// Attach to our exception wrapper // Attach to our exception wrapper
@ -29,7 +29,6 @@ class MeshUtilApplication : GeeksvilleApplication() {
} }
} }
// Mapbox Access token
Mapbox.getInstance(this, getString(R.string.mapbox_access_token)) Mapbox.getInstance(this, getString(R.string.mapbox_access_token))
} }
} }

Wyświetl plik

@ -7,6 +7,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import com.geeksville.android.GeeksvilleApplication
import com.geeksville.android.Logging import com.geeksville.android.Logging
import com.geeksville.mesh.NodeInfo import com.geeksville.mesh.NodeInfo
import com.geeksville.mesh.R import com.geeksville.mesh.R
@ -116,64 +117,80 @@ class MapFragment : ScreenFragment("Map"), Logging {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.map_view, container, false) ): View? {
// We can't allow mapbox if user doesn't want analytics
val id =
if ((requireContext().applicationContext as GeeksvilleApplication).isAnalyticsAllowed) {
// Mapbox Access token
R.layout.map_view
} else {
R.layout.map_not_allowed
}
lateinit var mapView: MapView return inflater.inflate(id, container, false)
}
var mapView: MapView? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mapView = view.findViewById(R.id.mapView) // We might not have a real mapview if running with analytics
mapView.onCreate(savedInstanceState) if ((requireContext().applicationContext as GeeksvilleApplication).isAnalyticsAllowed) {
val v = view.findViewById<MapView>(R.id.mapView)
mapView = v
v.onCreate(savedInstanceState)
mapView.getMapAsync { map -> v.getMapAsync { map ->
// val markerIcon = BitmapFactory.decodeResource(context.resources, R.drawable.ic_twotone_person_pin_24) // val markerIcon = BitmapFactory.decodeResource(context.resources, R.drawable.ic_twotone_person_pin_24)
val markerIcon = requireActivity().getDrawable(R.drawable.ic_twotone_person_pin_24)!! val markerIcon =
requireActivity().getDrawable(R.drawable.ic_twotone_person_pin_24)!!
map.setStyle(Style.OUTDOORS) { style -> map.setStyle(Style.OUTDOORS) { style ->
style.addSource(nodePositions) style.addSource(nodePositions)
style.addImage(markerImageId, markerIcon) style.addImage(markerImageId, markerIcon)
style.addLayer(nodeLayer) style.addLayer(nodeLayer)
style.addLayer(labelLayer) style.addLayer(labelLayer)
}
model.nodeDB.nodes.observe(viewLifecycleOwner, Observer { nodes ->
onNodesChanged(map, nodes.values)
})
//map.uiSettings.isScrollGesturesEnabled = true
//map.uiSettings.isZoomGesturesEnabled = true
} }
model.nodeDB.nodes.observe(viewLifecycleOwner, Observer { nodes ->
onNodesChanged(map, nodes.values)
})
//map.uiSettings.isScrollGesturesEnabled = true
//map.uiSettings.isZoomGesturesEnabled = true
} }
} }
override fun onPause() { override fun onPause() {
mapView.onPause() mapView?.onPause()
super.onPause() super.onPause()
} }
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
mapView.onStart() mapView?.onStart()
} }
override fun onStop() { override fun onStop() {
mapView.onStop() mapView?.onStop()
super.onStop() super.onStop()
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
mapView.onResume() mapView?.onResume()
} }
override fun onDestroy() { override fun onDestroy() {
mapView.onDestroy() mapView?.onDestroy()
super.onDestroy() super.onDestroy()
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
mapView.onSaveInstanceState(outState) mapView?.onSaveInstanceState(outState)
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
} }
} }

Wyświetl plik

@ -259,9 +259,13 @@ class SettingsFragment : ScreenFragment("Settings"), Logging {
requireActivity().hideKeyboard() requireActivity().hideKeyboard()
} }
// Set analytics checkbox
analyticsOkayCheckbox.isChecked =
(requireContext().applicationContext as GeeksvilleApplication).isAnalyticsAllowed
analyticsOkayCheckbox.setOnCheckedChangeListener { _, isChecked -> analyticsOkayCheckbox.setOnCheckedChangeListener { _, isChecked ->
// FIXME, preserve this in settings debug("User changed analytics to $isChecked")
analyticsOkayCheckbox.isChecked = true // so users will complain and I'll fix the bug (requireContext().applicationContext as GeeksvilleApplication).isAnalyticsAllowed =
isChecked
} }
scanModel.errorText.observe(viewLifecycleOwner, Observer { errMsg -> scanModel.errorText.observe(viewLifecycleOwner, Observer { errMsg ->

Wyświetl plik

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/map_not_allowed"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Wyświetl plik

@ -32,4 +32,7 @@
<string name="are_you_sure_channel">Are you sure you want to change the channel? All communication with other nodes will stop until you share the new channel settings.</string> <string name="are_you_sure_channel">Are you sure you want to change the channel? All communication with other nodes will stop until you share the new channel settings.</string>
<string name="new_channel_rcvd">New Channel URL received</string> <string name="new_channel_rcvd">New Channel URL received</string>
<string name="do_you_want_switch">Do you want to switch to the \'%s\' channel?</string> <string name="do_you_want_switch">Do you want to switch to the \'%s\' channel?</string>
<string name="map_not_allowed">You have analytics disabled. Unfortunately our map provider (mapbox) requires analytics to be allowed for their \'free\' plan. So we have turned off the map view.\n\n
If you would like to see the map, you\'ll need to turn on analytics in the Settings pane (also, for the time being you might need to force restart the application).\n\n
If you are interested in us paying for mapbox (or switching to a different map provider), please post in our forum.</string>
</resources> </resources>

@ -1 +1 @@
Subproject commit ebc40c05fd8c30aabb3070468627e5fe6ae59cd5 Subproject commit 7e91d36f464d681c1acf2bee5e1f6c85c04a382b

Wyświetl plik

@ -0,0 +1,742 @@
[
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629911091,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 3,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629915828,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 2,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629919413,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629922790,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"timestamp": 1586629928465,
"replacementText": "hhi",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/messageInputText",
"contentDescription": "",
"text": ""
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/textInputLayout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "PRESSED_EDITOR_ACTION",
"timestamp": 1586629935566,
"replacementText": "hhi",
"actionCode": 6,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/messageInputText",
"contentDescription": "",
"text": "hhi"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/textInputLayout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629943766,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629947847,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 2,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629951848,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 3,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629957343,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.checkbox.MaterialCheckBox",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 2,
"resourceId": "com.geeksville.mesh:id/editableCheckbox",
"contentDescription": "",
"text": ""
},
{
"className": "androidx.constraintlayout.widget.ConstraintLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_LONG_CLICKED",
"timestamp": 1586629963511,
"replacementText": "Default",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameEdit",
"contentDescription": "",
"text": "Default"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameView",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"timestamp": 1586629965913,
"replacementText": "Defaultx",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameEdit",
"contentDescription": "",
"text": "Default"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameView",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629968157,
"replacementText": "Defaultx",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameEdit",
"contentDescription": "",
"text": "Defaultx"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameView",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"timestamp": 1586629970340,
"replacementText": "Defaultxbb",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameEdit",
"contentDescription": "",
"text": "Defaultx"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameView",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "PRESSED_EDITOR_ACTION",
"timestamp": 1586629974781,
"replacementText": "Defaultxbb",
"actionCode": 6,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameEdit",
"contentDescription": "",
"text": "Defaultxbb"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/channelNameView",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629980271,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.checkbox.MaterialCheckBox",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 2,
"resourceId": "com.geeksville.mesh:id/editableCheckbox",
"contentDescription": "",
"text": ""
},
{
"className": "androidx.constraintlayout.widget.ConstraintLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629985704,
"replacementText": "Cancel",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": true,
"elementDescriptors": [
{
"className": "com.google.android.material.button.MaterialButton",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "android:id/button3",
"contentDescription": "",
"text": "Cancel"
},
{
"className": "androidx.appcompat.widget.ButtonBarLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "android.widget.ScrollView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 3,
"resourceId": "com.geeksville.mesh:id/buttonPanel",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_CLICKED",
"timestamp": 1586629990504,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.tabs.TabLayout$TabView",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 4,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout$SlidingTabIndicator",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.tabs.TabLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/tab_layout",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"timestamp": 1586629997403,
"replacementText": "Bob x",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/usernameEditText",
"contentDescription": "",
"text": ""
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/textInputLayout2",
"contentDescription": "",
"text": ""
}
]
},
{
"eventType": "PRESSED_EDITOR_ACTION",
"timestamp": 1586630009771,
"replacementText": "Bob x",
"actionCode": 6,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "com.google.android.material.textfield.TextInputEditText",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.geeksville.mesh:id/usernameEditText",
"contentDescription": "",
"text": "Bob x"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "",
"contentDescription": "",
"text": ""
},
{
"className": "com.google.android.material.textfield.TextInputLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "com.geeksville.mesh:id/textInputLayout2",
"contentDescription": "",
"text": ""
}
]
}
]