@@ -11,15 +11,18 @@ import android.content.pm.PackageManager
1111import android.os.Bundle
1212import android.telephony.PhoneNumberUtils
1313import android.telephony.TelephonyManager
14+ import android.view.View
1415import android.widget.TextView
1516import android.widget.Toast
1617import androidx.activity.result.contract.ActivityResultContracts
1718import androidx.appcompat.app.AppCompatActivity
1819import androidx.core.app.ActivityCompat
20+ import androidx.lifecycle.MutableLiveData
1921import androidx.work.ExistingPeriodicWorkPolicy
2022import androidx.work.PeriodicWorkRequestBuilder
2123import androidx.work.WorkManager
2224import com.google.android.material.button.MaterialButton
25+ import com.google.android.material.progressindicator.LinearProgressIndicator
2326import com.google.android.material.switchmaterial.SwitchMaterial
2427import com.httpsms.services.StickyNotificationService
2528import com.httpsms.worker.HeartbeatWorker
@@ -58,6 +61,7 @@ class MainActivity : AppCompatActivity() {
5861 startStickyNotification(this )
5962 scheduleHeartbeatWorker(this )
6063 setLastHeartbeatTimestamp(this )
64+ setHeartbeatListener(this )
6165 }
6266
6367 override fun onResume () {
@@ -82,7 +86,7 @@ class MainActivity : AppCompatActivity() {
8286 val localTime = timestampZdt.withZoneSameInstant(ZoneId .systemDefault())
8387 Timber .d(" heartbeat timestamp in UTC is [${timestampZdt} ] and local is [$localTime ]" )
8488
85- refreshTimestampView.text = localTime.format(DateTimeFormatter .ofPattern(" yyyy-MM-dd HH:mm:ss" ));
89+ refreshTimestampView.text = localTime.format(DateTimeFormatter .ofPattern(" yyyy-MM-dd HH:mm:ss" ))
8690 }
8791
8892 private fun scheduleHeartbeatWorker (context : Context ) {
@@ -283,4 +287,47 @@ class MainActivity : AppCompatActivity() {
283287
284288 Timber .d(" creating permissions launcher" )
285289 }
290+
291+ private fun setHeartbeatListener (context : Context ) {
292+ findViewById<MaterialButton >(R .id.mainHeartbeatButton).setOnClickListener{onHeartbeatClick(context)}
293+ }
294+
295+ private fun onHeartbeatClick (context : Context ) {
296+ Timber .d(" heartbeat button clicked" )
297+ val heartbeatButton = findViewById<MaterialButton >(R .id.mainHeartbeatButton)
298+ heartbeatButton.isEnabled = false
299+
300+ val progressBar = findViewById<LinearProgressIndicator >(R .id.mainProgressIndicator)
301+ progressBar.visibility = View .VISIBLE
302+
303+
304+ val liveData = MutableLiveData <String ?>()
305+ liveData.observe(this ) { exception ->
306+ run {
307+ progressBar.visibility = View .INVISIBLE
308+ heartbeatButton.isEnabled = true
309+
310+ if (exception != null ) {
311+ Timber .w(" heartbeat sending failed with [$exception ]" )
312+ Toast .makeText(context, exception, Toast .LENGTH_SHORT ).show()
313+ return @run
314+ }
315+ Toast .makeText(context, " Heartbeat Sent" , Toast .LENGTH_SHORT ).show()
316+ setLastHeartbeatTimestamp(this )
317+ }
318+ }
319+
320+ Thread {
321+ var error: String? = null
322+ try {
323+ HttpSmsApiService (Settings .getApiKeyOrDefault(context)).storeHeartbeat(Settings .getOwnerOrDefault(context))
324+ Settings .setHeartbeatTimestampAsync(applicationContext, System .currentTimeMillis())
325+ } catch (exception: Exception ) {
326+ Timber .e(exception)
327+ error = exception.javaClass.simpleName
328+ }
329+ liveData.postValue(error)
330+ Timber .d(" finished sending pulse" )
331+ }.start()
332+ }
286333}
0 commit comments