Skip to content

Commit baa0e7f

Browse files
Release-v3.0.2 package
1 parent b04401f commit baa0e7f

File tree

72 files changed

+1478
-210
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+1478
-210
lines changed

build/Si-Connect - v3_0_2.apk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:3fa75802b3c1f2b51d1b1ad19fc47810b078aeb5fa6dabb2052e1bd5194d9188
3+
size 77220803

mobile/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ android {
6666
create("Si-Connect") {
6767
dimension = versionDim
6868
applicationId = "com.siliconlabs.bledemo"
69-
versionCode = 58
70-
versionName = "3.0.1"
69+
versionCode = 59
70+
versionName = "3.0.2"
7171
}
7272
}
7373

mobile/src/main/java/com/siliconlabs/bledemo/Base/activities/BaseActivity.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.annotation.StringRes
88
import androidx.appcompat.app.AppCompatActivity
99
import com.siliconlabs.bledemo.R
1010
import com.siliconlabs.bledemo.base.dialogs.ProgressDialogWithSpinner
11+
import com.siliconlabs.bledemo.utils.CustomToastManager
1112
import timber.log.Timber
1213
abstract class BaseActivity : AppCompatActivity() {
1314
enum class ConnectionStatus {
@@ -64,15 +65,24 @@ abstract class BaseActivity : AppCompatActivity() {
6465
}
6566

6667
fun showMessage(message: String) {
67-
runOnUiThread { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() }
68+
runOnUiThread {
69+
//Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
70+
CustomToastManager.show(this@BaseActivity,message,5000)
71+
}
6872
}
6973

7074
fun showMessage(stringResId: Int) {
71-
runOnUiThread { Toast.makeText(this, stringResId, Toast.LENGTH_SHORT).show() }
75+
runOnUiThread {
76+
//Toast.makeText(this, stringResId, Toast.LENGTH_SHORT).show()
77+
CustomToastManager.show(this@BaseActivity,getString(stringResId),5000)
78+
}
7279
}
7380

7481
fun showLongMessage(message: String) {
75-
runOnUiThread { Toast.makeText(this, message, Toast.LENGTH_LONG).show() }
82+
runOnUiThread {
83+
//Toast.makeText(this, message, Toast.LENGTH_LONG).show()
84+
CustomToastManager.show(this@BaseActivity,message,5000)
85+
}
7686
}
7787

7888
fun hideKeyboard() {

mobile/src/main/java/com/siliconlabs/bledemo/Base/activities/BaseDemoActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import android.widget.Toast
1313
import com.siliconlabs.bledemo.bluetooth.services.BluetoothService
1414
import com.siliconlabs.bledemo.R
1515
import com.siliconlabs.bledemo.home_screen.dialogs.SelectDeviceDialog
16+
import com.siliconlabs.bledemo.utils.CustomToastManager
1617

1718
abstract class BaseDemoActivity : BaseActivity() {
1819

@@ -49,7 +50,8 @@ abstract class BaseDemoActivity : BaseActivity() {
4950
bluetoothBinding.unbind()
5051

5152
if (isGattConnected) {
52-
Toast.makeText(this, getString(R.string.device_has_disconnected), Toast.LENGTH_SHORT).show()
53+
//Toast.makeText(this, getString(R.string.device_has_disconnected), Toast.LENGTH_SHORT).show()
54+
CustomToastManager.show(this@BaseDemoActivity,getString(R.string.device_has_disconnected),5000)
5355
}
5456
}
5557

mobile/src/main/java/com/siliconlabs/bledemo/Base/fragments/BaseDialogFragment.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import android.widget.LinearLayout
1212
import android.widget.Toast
1313
import androidx.annotation.StringRes
1414
import androidx.fragment.app.DialogFragment
15+
import com.siliconlabs.bledemo.utils.CustomToastManager
1516

1617
open class BaseDialogFragment(
1718
private val hasCustomWidth: Boolean? = null,
@@ -42,7 +43,8 @@ open class BaseDialogFragment(
4243

4344
protected fun showMessage(@StringRes message: Int) {
4445
activity?.runOnUiThread {
45-
Toast.makeText(context, getString(message), Toast.LENGTH_SHORT).show()
46+
//Toast.makeText(context, getString(message), Toast.LENGTH_SHORT).show()
47+
CustomToastManager.show(requireContext(),getString(message),5000)
4648
}
4749
}
4850

mobile/src/main/java/com/siliconlabs/bledemo/Bluetooth/Services/BluetoothService.kt

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import android.os.Handler
3333
import android.os.Looper
3434
import android.widget.Toast
3535
import androidx.core.location.LocationManagerCompat
36+
import androidx.localbroadcastmanager.content.LocalBroadcastManager
3637
import com.siliconlabs.bledemo.R
3738
import com.siliconlabs.bledemo.bluetooth.ble.BleScanCallback
3839
import com.siliconlabs.bledemo.bluetooth.ble.BluetoothDeviceInfo
@@ -52,6 +53,11 @@ import com.siliconlabs.bledemo.features.scan.browser.models.logs.GattOperationWi
5253
import com.siliconlabs.bledemo.features.scan.browser.models.logs.Log
5354
import com.siliconlabs.bledemo.features.scan.browser.models.logs.TimeoutLog
5455
import com.siliconlabs.bledemo.home_screen.activities.MainActivity
56+
import com.siliconlabs.bledemo.home_screen.activities.MainActivity.Companion.ACTION_SHOW_CUSTOM_TOAST
57+
import com.siliconlabs.bledemo.home_screen.activities.MainActivity.Companion.EXTRA_TOAST_MESSAGE
58+
import com.siliconlabs.bledemo.home_screen.menu_items.HealthThermometer
59+
import com.siliconlabs.bledemo.utils.BLEUtils
60+
import com.siliconlabs.bledemo.utils.CustomToastManager
5561
import com.siliconlabs.bledemo.utils.LocalService
5662
import com.siliconlabs.bledemo.utils.Notifications
5763
import com.siliconlabs.bledemo.utils.UuidConsts
@@ -68,6 +74,8 @@ import java.util.UUID
6874
@SuppressLint("MissingPermission")
6975
class BluetoothService : LocalService<BluetoothService>() {
7076

77+
var bluetoothContext:Context? = null
78+
7179
companion object {
7280
private const val RECONNECTION_RETRIES = 3
7381
private const val RECONNECTION_DELAY = 1000L //connection drops after ~ 4s when reconnecting without delay
@@ -106,7 +114,8 @@ class BluetoothService : LocalService<BluetoothService>() {
106114
MATTER_DEMO,
107115
WIFI_OTA_UPDATE,
108116
DEV_KIT_SENSOR,
109-
WIFI_THROUGHPUT_TEST
117+
WIFI_THROUGHPUT_TEST,
118+
NOTHING
110119
}
111120

112121
interface ScanListener {
@@ -190,7 +199,14 @@ class BluetoothService : LocalService<BluetoothService>() {
190199
private val scanTimeoutRunnable = Runnable {
191200
stopDiscovery()
192201
scanListeners.onDiscoveryTimeout()
193-
Toast.makeText(this, getString(R.string.toast_scan_timeout), Toast.LENGTH_SHORT).show()
202+
//Toast.makeText(this, getString(R.string.toast_scan_timeout), Toast.LENGTH_SHORT).show()
203+
/*handler.post {
204+
this.let { CustomToastManager.show(it,getString(R.string.toast_scan_timeout)) }
205+
}*/
206+
val intent = Intent(ACTION_SHOW_CUSTOM_TOAST).apply {
207+
putExtra(EXTRA_TOAST_MESSAGE, getString(R.string.toast_scan_timeout))
208+
}
209+
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
194210
}
195211

196212
private var reconnectionRunnable: ReconnectionRunnable? = null
@@ -242,6 +258,7 @@ class BluetoothService : LocalService<BluetoothService>() {
242258
private val bluetoothReceiver: BroadcastReceiver = object : BroadcastReceiver() {
243259
override fun onReceive(context: Context, intent: Intent) {
244260
val action = intent.action
261+
bluetoothContext = context
245262
if (action == BluetoothAdapter.ACTION_STATE_CHANGED) {
246263
val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)
247264
when (state) {
@@ -355,11 +372,11 @@ class BluetoothService : LocalService<BluetoothService>() {
355372
if (useBLE) {
356373
bleScannerCallback = BleScanCallback(this)
357374
val settings = ScanSettings.Builder()
358-
.setLegacy(false)
359-
.setReportDelay(0)
360-
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build()
375+
.setLegacy(false)
376+
.setReportDelay(getReportDelay())
377+
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build()
361378
adapter.bluetoothLeScanner?.startScan(filters, settings, bleScannerCallback)
362-
?: onDiscoveryFailed(ScanError.LeScannerUnavailable)
379+
?: onDiscoveryFailed(ScanError.LeScannerUnavailable)
363380
} else {
364381
if (!adapter.startDiscovery()) onDiscoveryFailed(ScanError.BluetoothAdapterUnavailable)
365382
else timeoutInSeconds?.let {
@@ -369,6 +386,44 @@ class BluetoothService : LocalService<BluetoothService>() {
369386
} ?: onDiscoveryFailed(ScanError.BluetoothAdapterUnavailable)
370387
}
371388

389+
/**
390+
* Determines the report delay for BLE scanning based on the GATT connection type.
391+
*
392+
* The report delay is set to 0 milliseconds for specific GATT connection types,
393+
* including:
394+
* - IOP_TEST
395+
* - THERMOMETER
396+
* - LIGHT
397+
* - RANGE_TEST
398+
* - BLINKY
399+
* - THROUGHPUT_TEST
400+
* - MOTION
401+
* - ENVIRONMENT
402+
* - WIFI_COMMISSIONING
403+
* - ESL_DEMO
404+
* - DEV_KIT_SENSOR
405+
*
406+
* For all other GATT connection types, the report delay is set to 1000 milliseconds.
407+
*
408+
* @return The report delay in milliseconds.
409+
*/
410+
fun getReportDelay(): Long {
411+
return when (BLEUtils.GATT_DEVICE_SELECTED) {
412+
GattConnectType.IOP_TEST,
413+
GattConnectType.THERMOMETER,
414+
GattConnectType.LIGHT,
415+
GattConnectType.RANGE_TEST,
416+
GattConnectType.BLINKY,
417+
GattConnectType.THROUGHPUT_TEST,
418+
GattConnectType.MOTION,
419+
GattConnectType.ENVIRONMENT,
420+
GattConnectType.WIFI_COMMISSIONING,
421+
GattConnectType.ESL_DEMO,
422+
GattConnectType.DEV_KIT_SENSOR -> 0L
423+
else -> 1000L
424+
}
425+
}
426+
372427
fun onDiscoveryFailed(scanError: ScanError, errorCode: Int? = null) {
373428
handler.removeCallbacks(scanTimeoutRunnable)
374429
val message = when (scanError) {
@@ -382,7 +437,11 @@ class BluetoothService : LocalService<BluetoothService>() {
382437
ScanError.BluetoothAdapterUnavailable -> getString(R.string.scan_failed_bluetooth_adapter_unavailable)
383438
}
384439
scanListeners.onDiscoveryFailed()
385-
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
440+
//Toast.makeText(this, message, Toast.LENGTH_LONG).show()
441+
val intent = Intent(ACTION_SHOW_CUSTOM_TOAST).apply {
442+
putExtra(EXTRA_TOAST_MESSAGE, message)
443+
}
444+
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
386445
}
387446

388447
fun stopDiscovery() {

mobile/src/main/java/com/siliconlabs/bledemo/Utils/BLEUtils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import android.bluetooth.BluetoothGattCharacteristic
66
import android.bluetooth.BluetoothGattService
77
import com.siliconlabs.bledemo.bluetooth.ble.GattCharacteristic
88
import com.siliconlabs.bledemo.bluetooth.ble.GattService
9+
import com.siliconlabs.bledemo.bluetooth.services.BluetoothService
910
import java.util.*
1011

1112
@SuppressLint("MissingPermission")
1213
object BLEUtils {
1314

15+
var GATT_DEVICE_SELECTED = BluetoothService.GattConnectType.NOTHING
1416

1517
fun setNotificationForCharacteristic(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic?, gattDescriptor: UUID?, value: Notifications): Boolean {
1618
var written = false
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.siliconlabs.bledemo.utils
2+
3+
4+
5+
import android.app.Service
6+
import android.content.Context
7+
import android.graphics.PixelFormat
8+
import android.os.Handler
9+
import android.os.Looper
10+
import android.view.*
11+
import android.widget.TextView
12+
import android.widget.Toast
13+
import com.siliconlabs.bledemo.R
14+
import timber.log.Timber
15+
import java.util.logging.Logger
16+
17+
object CustomToastManager {
18+
private var toastView: View? = null
19+
private var windowManager: WindowManager? = null
20+
21+
fun show(context: Context, message: String, duration: Long = 5000,showStandardToast: Boolean = true) {
22+
val handler = Handler(Looper.getMainLooper())
23+
24+
handler.post {
25+
// Use standard Toast for non-activity contexts
26+
//Toast.makeText(context, message, Toast.LENGTH_LONG).show()
27+
28+
// Inflate custom layout
29+
val inflater = LayoutInflater.from(context)
30+
val customToastView = inflater.inflate(R.layout.custom_toast, null)
31+
val textView: TextView = customToastView.findViewById(R.id.custom_toast_text)
32+
textView.text = message
33+
34+
35+
36+
// Remove any existing toast
37+
dismiss()
38+
39+
// Display custom toast for longer duration (only for Activity-based context)
40+
windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
41+
val params = WindowManager.LayoutParams(
42+
WindowManager.LayoutParams.WRAP_CONTENT,
43+
WindowManager.LayoutParams.WRAP_CONTENT,
44+
WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, // No special permission needed
45+
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
46+
PixelFormat.TRANSLUCENT
47+
)
48+
params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
49+
params.y = 200 // Adjust position from bottom
50+
51+
windowManager?.addView(customToastView, params)
52+
toastView = customToastView
53+
54+
// Auto-dismiss after duration
55+
handler.postDelayed({ dismiss() }, duration)
56+
}
57+
}
58+
59+
fun dismiss() {
60+
toastView?.let {
61+
try {
62+
if(it.windowToken != null){
63+
windowManager?.removeView(it)
64+
}
65+
}catch (e:IllegalArgumentException){
66+
Timber.e(e.message)
67+
} finally {
68+
toastView = null
69+
}
70+
71+
72+
}
73+
}
74+
}

mobile/src/main/java/com/siliconlabs/bledemo/features/configure/advertiser/adapters/AdvertiserAdapter.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.siliconlabs.bledemo.features.configure.advertiser.utils.Translator
1111
import com.siliconlabs.bledemo.features.configure.advertiser.views.AdvertiserDetails
1212
import com.siliconlabs.bledemo.R
1313
import com.siliconlabs.bledemo.databinding.AdapterAdvertiserBinding
14+
import com.siliconlabs.bledemo.utils.CustomToastManager
1415

1516
class AdvertiserAdapter(
1617
private val items: ArrayList<Advertiser>,
@@ -85,7 +86,9 @@ class AdvertiserAdapter(
8586
if (isChecked) clickListener.switchItemOn(adapterPosition)
8687
else clickListener.switchItemOff(adapterPosition)
8788
} else {
88-
Toast.makeText(itemView.context, R.string.toast_bluetooth_not_enabled, Toast.LENGTH_SHORT).show()
89+
//Toast.makeText(itemView.context, R.string.toast_bluetooth_not_enabled, Toast.LENGTH_SHORT).show()
90+
val message = itemView.context.getString(R.string.toast_bluetooth_not_enabled)
91+
CustomToastManager.show(itemView.context,message,5000)
8992
if (isChecked) viewBinding.swAdvertiser.isChecked = false
9093
}
9194
}

mobile/src/main/java/com/siliconlabs/bledemo/features/configure/gatt_configurator/activities/GattServerActivity.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.siliconlabs.bledemo.features.configure.gatt_configurator.viewmodels.G
2626
import com.siliconlabs.bledemo.features.configure.gatt_configurator.viewmodels.GattServerViewModel.Validation
2727
import com.siliconlabs.bledemo.common.other.EqualVerticalItemDecoration
2828
import com.siliconlabs.bledemo.databinding.ActivityGattServerBinding
29+
import com.siliconlabs.bledemo.utils.CustomToastManager
2930

3031
//import kotlinx.android.synthetic.main.activity_gatt_server.*
3132

@@ -67,11 +68,14 @@ class GattServerActivity : BaseActivity(), ServiceListener, AddServiceListener {
6768

6869
viewModel.validation.observe(this, Observer {
6970
when (it) {
70-
Validation.INVALID_NAME -> Toast.makeText(
71+
Validation.INVALID_NAME ->
72+
CustomToastManager.show(this@GattServerActivity,
73+
getString(R.string.gatt_configurator_toast_invalid_gatt_server_name),5000)
74+
/*Toast.makeText(
7175
this,
7276
R.string.gatt_configurator_toast_invalid_gatt_server_name,
7377
Toast.LENGTH_SHORT
74-
).show()
78+
).show()*/
7579

7680
else -> saveGattServer()
7781
}

0 commit comments

Comments
 (0)