From c0b6177bfa83fb9b668c7d05009696c1728e4a88 Mon Sep 17 00:00:00 2001 From: Michael Ritchie Date: Mon, 24 May 2021 17:42:08 -0300 Subject: [PATCH] * added hack for missing pending w/delay state from alarmo (sends trigger instead) * fixed issue displaying countdown timer on pending when entry detected * fixed alarm sound when entry detected * removed dragging ability from code bottom sheet --- app/build.gradle | 2 +- .../alarmpanel/network/AlarmPanelService.kt | 27 ++- .../alarmpanel/ui/activities/MainActivity.kt | 199 ++++++++++-------- .../ui/fragments/CodeBottomSheetFragment.kt | 39 +++- .../ui/fragments/ControlsFragment.kt | 61 ++---- .../fragments/OptionsBottomSheetFragment.kt | 1 + .../iot/mqtt/alarmpanel/utils/MqttUtils.kt | 1 + .../fragment_code_bottom_sheet.xml | 8 +- .../fragment_code_bottom_sheet.xml | 8 +- .../fragment_code_bottom_sheet.xml | 9 +- .../fragment_code_bottom_sheet.xml | 8 +- .../fragment_code_bottom_sheet.xml | 8 +- .../res/layout/fragment_code_bottom_sheet.xml | 6 +- app/src/main/res/values/strings.xml | 2 +- 14 files changed, 208 insertions(+), 171 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ad41b8..9555c3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ apply plugin: 'com.google.firebase.crashlytics' def versionMajor = 1 def versionMinor = 1 def versionPatch = 1 -def versionBuild = 0 // bump for dog food builds, public betas, etc. +def versionBuild = 1 // bump for dog food builds, public betas, etc. def ALARM_CODE() { Properties properties = new Properties() diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/AlarmPanelService.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/AlarmPanelService.kt index ba40a8c..73acb3c 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/AlarmPanelService.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/network/AlarmPanelService.kt @@ -65,6 +65,7 @@ import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_COMM import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_INVALID_CODE import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_NO_CODE import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_SYSTEM_DISABLED +import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_TRIGGER import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.EVENT_UNKNOWN import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_ARM_AWAY import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_ARM_CUSTOM_BYPASS @@ -75,6 +76,7 @@ import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_CURR import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_DISARM import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_PRESENCE import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_SCREEN_ON +import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.STATE_TRIGGERED import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.TYPE_ALARM import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.TYPE_COMMAND import com.thanksmister.iot.mqtt.alarmpanel.utils.MqttUtils.Companion.TYPE_EVENT @@ -678,7 +680,7 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { insertMessage(id, topic, event, TYPE_EVENT) } EVENT_SYSTEM_DISABLED -> { - sendSnackMessage(getString(R.string.error_system_disabled)) + sendAlertMessage(getString(R.string.error_system_disabled)) insertMessage(id, topic, event, TYPE_EVENT) } EVENT_COMMAND_NOT_ALLOWED -> { @@ -690,11 +692,11 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { insertMessage(id, topic, event, TYPE_EVENT) } EVENT_UNKNOWN -> { - sendSnackMessage(getString(R.string.error_unknown)) + sendAlertMessage(getString(R.string.error_unknown)) insertMessage(id, topic, event, TYPE_EVENT) } EVENT_ARM_FAILED -> { - sendSnackMessage(getString(R.string.error_arm_failed)) + sendAlertMessage(getString(R.string.error_arm_failed)) insertMessage(id, topic, event, TYPE_EVENT) } STATE_ARM_HOME, @@ -708,6 +710,12 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { val delay = MqttUtils.parseDelayFromJson(payload) insertMessage(id, topic, event, TYPE_ALARM, delay) } + // TODO this is a hack for alarmo because does not append delay time to pending + EVENT_TRIGGER -> { + val delay = MqttUtils.parseDelayFromJson(payload) + insertMessage(id, topic, event, TYPE_EVENT) + sendTriggerEvent(delay) + } } } } @@ -959,6 +967,7 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { private fun insertMessage(messageId: String, topic: String, payload: String, type: String, delay: Int = -1) { Timber.d("insertMessage topic: $topic") Timber.d("insertMessage payload: $payload") + Timber.d("insertMessage delay: $delay") disposable.add(Completable.fromAction { val createdAt = DateUtils.generateCreatedAtDate() val message = MessageMqtt() @@ -1024,6 +1033,14 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { bm.sendBroadcast(intent) } + private fun sendTriggerEvent(delay: Int) { + val intent = Intent(BROADCAST_TRIGGER_EVENT) + intent.putExtra(EXTRA_DELAY_TIME, delay) + intent.putExtra(EXTRA_STATE, MqttUtils.STATE_PENDING) + val bm = LocalBroadcastManager.getInstance(applicationContext) + bm.sendBroadcast(intent) + } + private fun sendWakeScreen() { Timber.d("sendWakeScreen") val intent = Intent(BROADCAST_SCREEN_WAKE) @@ -1237,7 +1254,7 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { const val BROADCAST_EVENT_USER_INACTIVE = "BROADCAST_EVENT_USER_INACTIVE" const val BROADCAST_EVENT_ALARM_MODE = "BROADCAST_EVENT_ALARM_MODE" const val BROADCAST_ALARM_COMMAND = "BROADCAST_ALARM_COMMAND" - const val BROADCAST_ALARM_DELAY = "BROADCAST_ALARM_DELAY" + const val BROADCAST_TRIGGER_EVENT = "BROADCAST_TRIGGER_EVENT" const val BROADCAST_EVENT_ALARM_CODE = "BROADCAST_EVENT_ALARM_CODE" const val BROADCAST_ALERT_MESSAGE = "BROADCAST_ALERT_MESSAGE" const val BROADCAST_SNACK_MESSAGE = "BROADCAST_SNACK_MESSAGE" @@ -1246,5 +1263,7 @@ class AlarmPanelService : LifecycleService(), MQTTModule.MQTTListener { const val BROADCAST_CLEAR_ALERT_MESSAGE = "BROADCAST_CLEAR_ALERT_MESSAGE" const val BROADCAST_SERVICE_STARTED = "BROADCAST_SERVICE_STARTED" const val BROADCAST_DASHBOARD = "BROADCAST_ACTION_LOAD_URL" + const val EXTRA_DELAY_TIME = "EXTRA_DELAY_TIME" + const val EXTRA_STATE = "EXTRA_STATE" } } \ No newline at end of file diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/activities/MainActivity.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/activities/MainActivity.kt index 9c482d3..8957e27 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/activities/MainActivity.kt @@ -42,6 +42,7 @@ import com.thanksmister.iot.mqtt.alarmpanel.constants.CodeTypes import com.thanksmister.iot.mqtt.alarmpanel.network.AlarmPanelService import com.thanksmister.iot.mqtt.alarmpanel.network.AlarmPanelService.Companion.BROADCAST_EVENT_PUBLISH_PANIC import com.thanksmister.iot.mqtt.alarmpanel.network.AlarmPanelService.Companion.BROADCAST_SNACK_MESSAGE +import com.thanksmister.iot.mqtt.alarmpanel.network.MQTTOptions import com.thanksmister.iot.mqtt.alarmpanel.persistence.Weather import com.thanksmister.iot.mqtt.alarmpanel.ui.adapters.MainSlidePagerAdapter import com.thanksmister.iot.mqtt.alarmpanel.ui.fragments.* @@ -283,15 +284,16 @@ class MainActivity : BaseActivity(), awakenDeviceForAction() // 3 hours stopDisconnectTimer() // stop screen saver mode clearInactivityTimer() // Remove inactivity timer + dismissBottomSheets() } MqttUtils.STATE_PENDING -> { awakenDeviceForAction() resetInactivityTimer() - if (configuration.isAlarmArmedMode()) { - showCodeDialog(CodeTypes.DISARM, delay) - } + val pendingTime = getPendingTime(payload, delay) + showCodeDialog(CodeTypes.DISARM, pendingTime) } MqttUtils.STATE_ARMING -> { + dismissBottomSheets() awakenDeviceForAction() resetInactivityTimer() } @@ -348,6 +350,7 @@ class MainActivity : BaseActivity(), filter.addAction(AlarmPanelService.BROADCAST_SCREEN_WAKE) filter.addAction(AlarmPanelService.BROADCAST_SERVICE_STARTED) filter.addAction(AlarmPanelService.BROADCAST_DASHBOARD) + filter.addAction(AlarmPanelService.BROADCAST_TRIGGER_EVENT) filter.addAction(BROADCAST_SNACK_MESSAGE) filter.addAction(BROADCAST_EVENT_PUBLISH_PANIC) localBroadCastManager = LocalBroadcastManager.getInstance(this) @@ -500,39 +503,39 @@ class MainActivity : BaseActivity(), startActivity(intent) } - /** - * Show the code dialog with a CodeTypes value take different actions on code such as disarm, settings, or arming. - */ - @Deprecated("Doesn't appear to be used") - private fun showDisarmCodeDialog(delay: Int?) { - var codeType = CodeTypes.DISARM - if (mqttOptions.useRemoteCode) { - codeType = CodeTypes.DISARM_REMOTE - } - codeBottomSheet = CodeBottomSheetFragment.newInstance(configuration.alarmCode.toString(), delay, codeType, - object : CodeBottomSheetFragment.OnAlarmCodeFragmentListener { - override fun onComplete(code: String) { - if (codeType == CodeTypes.DISARM) { - publishDisarm(code) - } - codeBottomSheet?.dismiss() - } - - override fun onCodeError() { - Toast.makeText(this@MainActivity, R.string.toast_code_invalid, Toast.LENGTH_SHORT).show() - } - override fun onCancel() { - codeBottomSheet?.dismiss() - } - }) - codeBottomSheet?.show(supportFragmentManager, codeBottomSheet?.tag) + private fun getPendingTime(state: String, delay: Int?): Int { + delay?.let { + return it + } + when (state) { + MqttUtils.COMMAND_ARM_HOME, + MqttUtils.STATE_ARM_HOME -> { + return mqttOptions.pendingTimeHome + } + MqttUtils.COMMAND_ARM_AWAY, + MqttUtils.STATE_ARM_AWAY -> { + return mqttOptions.pendingTimeAway + } + MqttUtils.COMMAND_ARM_NIGHT, + MqttUtils.STATE_ARM_NIGHT -> { + return mqttOptions.pendingTimeNight + } + MqttUtils.COMMAND_ARM_CUSTOM_BYPASS, + MqttUtils.STATE_ARM_CUSTOM_BYPASS -> { + return mqttOptions.pendingTimeBypass + } + else -> { + return 0 + } + } } /** * Show the code dialog with a CodeTypes value take different actions on code such as disarm, settings, or arming. */ override fun showCodeDialog(type: CodeTypes, delay: Int?) { + Timber.d("isAlarmArmedMode 3 showCodeDialog") var codeType = type val useRemoteCode = mqttOptions.useRemoteCode if (useRemoteCode) { @@ -542,44 +545,51 @@ class MainActivity : BaseActivity(), codeType = CodeTypes.ARM_REMOTE } } - codeBottomSheet = CodeBottomSheetFragment.newInstance(configuration.alarmCode.toString(), delay, codeType, - object : CodeBottomSheetFragment.OnAlarmCodeFragmentListener { - override fun onComplete(code: String) { - when (type) { - CodeTypes.DISARM -> { - publishDisarm(code) - } - CodeTypes.SETTINGS -> { - openSettings() - } - CodeTypes.ARM_HOME -> { - publishArmedHome(code) - } - CodeTypes.ARM_AWAY -> { - publishArmedAway(code) - } - CodeTypes.ARM_NIGHT -> { - publishArmedNight(code) - } - CodeTypes.ARM_BYPASS -> { - publishCustomBypass(code) - } - else -> { - // na-da + if(codeBottomSheet == null || codeBottomSheet?.isAdded == false) { + Timber.d("isAlarmArmedMode 4 codeBottomSheet") + codeBottomSheet = CodeBottomSheetFragment.newInstance(configuration.alarmCode.toString(), delay, codeType, + object : CodeBottomSheetFragment.OnAlarmCodeFragmentListener { + override fun onComplete(code: String) { + when (type) { + CodeTypes.DISARM -> { + publishDisarm(code) + } + CodeTypes.SETTINGS -> { + openSettings() + } + CodeTypes.ARM_HOME -> { + publishArmedHome(code) + } + CodeTypes.ARM_AWAY -> { + publishArmedAway(code) + } + CodeTypes.ARM_NIGHT -> { + publishArmedNight(code) + } + CodeTypes.ARM_BYPASS -> { + publishCustomBypass(code) + } + else -> { + // na-da + } } + codeBottomSheet?.dismiss() } - codeBottomSheet?.dismiss() - } - override fun onCodeError() { - Toast.makeText(this@MainActivity, R.string.toast_code_invalid, Toast.LENGTH_SHORT).show() - } + override fun onCodeEmpty() { + Toast.makeText(this@MainActivity, R.string.error_no_code, Toast.LENGTH_LONG).show() + } - override fun onCancel() { - codeBottomSheet?.dismiss() - } - }) - codeBottomSheet?.show(supportFragmentManager, codeBottomSheet?.tag) + override fun onCodeError() { + Toast.makeText(this@MainActivity, R.string.toast_code_invalid, Toast.LENGTH_LONG).show() + } + + override fun onCancel() { + codeBottomSheet?.dismiss() + } + }) + codeBottomSheet?.show(supportFragmentManager, codeBottomSheet?.tag) + } } override fun showAlarmTriggered() { @@ -595,40 +605,42 @@ class MainActivity : BaseActivity(), } override fun showArmOptionsDialog() { - optionsBottomSheet = OptionsBottomSheetFragment(object : OptionsBottomSheetFragment.OptionsBottomSheetFragmentListener { - override fun onArmHome() { - if (mqttOptions.requireCodeForArming) { - showCodeDialog(CodeTypes.ARM_HOME, -1) - } else { - publishArmedHome("") + if(optionsBottomSheet == null || optionsBottomSheet?.isAdded == false) { + optionsBottomSheet = OptionsBottomSheetFragment(object : OptionsBottomSheetFragment.OptionsBottomSheetFragmentListener { + override fun onArmHome() { + if (mqttOptions.requireCodeForArming) { + showCodeDialog(CodeTypes.ARM_HOME, -1) + } else { + publishArmedHome("") + } } - } - override fun onArmAway() { - if (mqttOptions.requireCodeForArming) { - showCodeDialog(CodeTypes.ARM_AWAY, -1) - } else { - publishArmedAway("") + override fun onArmAway() { + if (mqttOptions.requireCodeForArming) { + showCodeDialog(CodeTypes.ARM_AWAY, -1) + } else { + publishArmedAway("") + } } - } - override fun onArmNight() { - if (mqttOptions.requireCodeForArming) { - showCodeDialog(CodeTypes.ARM_NIGHT, -1) - } else { - publishArmedNight("") + override fun onArmNight() { + if (mqttOptions.requireCodeForArming) { + showCodeDialog(CodeTypes.ARM_NIGHT, -1) + } else { + publishArmedNight("") + } } - } - override fun onArmCustomBypass() { - if (mqttOptions.requireCodeForArming) { - showCodeDialog(CodeTypes.ARM_BYPASS, -1) - } else { - publishCustomBypass("") + override fun onArmCustomBypass() { + if (mqttOptions.requireCodeForArming) { + showCodeDialog(CodeTypes.ARM_BYPASS, -1) + } else { + publishCustomBypass("") + } } - } - }, mqttOptions = mqttOptions) - optionsBottomSheet?.show(supportFragmentManager, optionsBottomSheet?.tag) + }, mqttOptions = mqttOptions) + optionsBottomSheet?.show(supportFragmentManager, optionsBottomSheet?.tag) + } } override fun onSendAlert() { @@ -722,6 +734,13 @@ class MainActivity : BaseActivity(), } else if (AlarmPanelService.BROADCAST_DASHBOARD == intent.action && !isFinishing) { val dashboard = intent.getIntExtra(AlarmPanelService.BROADCAST_DASHBOARD, 0) navigateDashBoard(dashboard) + } else if (AlarmPanelService.BROADCAST_TRIGGER_EVENT == intent.action && !isFinishing) { + val delay = intent.getIntExtra(AlarmPanelService.EXTRA_DELAY_TIME, -1) + val state = intent.getStringExtra(AlarmPanelService.EXTRA_STATE).orEmpty() + val pendingTime = getPendingTime(state, delay) + awakenDeviceForAction() + resetInactivityTimer() + showCodeDialog(CodeTypes.DISARM, pendingTime) } } } diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/CodeBottomSheetFragment.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/CodeBottomSheetFragment.kt index 2b3634d..ae8fb91 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/CodeBottomSheetFragment.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/CodeBottomSheetFragment.kt @@ -17,11 +17,13 @@ package com.thanksmister.iot.mqtt.alarmpanel.ui.fragments import android.os.Bundle +import android.os.CountDownTimer import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver +import android.view.animation.RotateAnimation import android.widget.FrameLayout import androidx.annotation.NonNull import androidx.annotation.Nullable @@ -31,12 +33,17 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.thanksmister.iot.mqtt.alarmpanel.R import com.thanksmister.iot.mqtt.alarmpanel.constants.CodeTypes import kotlinx.android.synthetic.main.fragment_code_bottom_sheet.* +import kotlinx.android.synthetic.main.fragment_code_bottom_sheet.countDownProgressWheel +import kotlinx.android.synthetic.main.fragment_controls.* import kotlinx.android.synthetic.main.view_keypad.* +import timber.log.Timber class CodeBottomSheetFragment (private val alarmListener: OnAlarmCodeFragmentListener) : BottomSheetDialogFragment() { private var codeComplete = false private var enteredCode = "" + private var countDownTimer: CountDownTimer? = null + private var countDownTimeRemaining: Int = 0 private val handler: Handler by lazy { Handler() } @@ -55,6 +62,7 @@ class CodeBottomSheetFragment (private val alarmListener: OnAlarmCodeFragmentLis interface OnAlarmCodeFragmentListener { fun onComplete(code: String) fun onCodeError() + fun onCodeEmpty() fun onCancel() } @@ -103,6 +111,7 @@ class CodeBottomSheetFragment (private val alarmListener: OnAlarmCodeFragmentLis val dialog = dialog as BottomSheetDialog val bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout? val behavior = BottomSheetBehavior.from(bottomSheet!!) + behavior.isDraggable = false behavior.state = BottomSheetBehavior.STATE_EXPANDED } }) @@ -110,14 +119,34 @@ class CodeBottomSheetFragment (private val alarmListener: OnAlarmCodeFragmentLis if(codeType == CodeTypes.ARM_REMOTE || codeType == CodeTypes.DISARM_REMOTE) { buttonKey.visibility = View.VISIBLE buttonKey.setOnClickListener { - codeComplete = true - handler.postDelayed(delayRunnable, 500) + if(enteredCode.isNotEmpty()) { + codeComplete = true + handler.postDelayed(delayRunnable, 500) + } else { + alarmListener.onCodeEmpty() + } } } if(delayTime > 0) { countDownProgressWheel.visibility = View.VISIBLE - countDownProgressWheel.setWheelProgress(delayTime) + val divideBy = 360 / delayTime + countDownTimer = object : CountDownTimer((delayTime * 1000).toLong(), 1000) { + override fun onTick(millisUntilFinished: Long) { + countDownTimeRemaining = (millisUntilFinished / 1000).toInt() + val an = RotateAnimation(0.0f, 90.0f, 250f, 273f) + an.fillAfter = true + countDownProgressWheel.setText(countDownTimeRemaining.toString()) + countDownProgressWheel.setWheelProgress(countDownTimeRemaining * divideBy) + } + + override fun onFinish() { + Timber.d("Timed up...") + countDownTimeRemaining = 0 + countDownProgressWheel.visibility = View.GONE + onCancel() + } + }.start() } } @@ -148,6 +177,10 @@ class CodeBottomSheetFragment (private val alarmListener: OnAlarmCodeFragmentLis override fun onDestroy() { super.onDestroy() handler.removeCallbacks(delayRunnable) + countDownTimer?.cancel() + countDownTimer = null + countDownTimeRemaining = 0 + countDownProgressWheel?.visibility = View.GONE } private fun addPinCode(code: String) { diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/ControlsFragment.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/ControlsFragment.kt index 090ffa3..35f8a26 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/ControlsFragment.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/ControlsFragment.kt @@ -278,7 +278,7 @@ class ControlsFragment : BaseFragment() { } STATE_PENDING -> { if (configuration.isAlarmArmedMode()) { - setEntryMode(delay) + setEntryMode(payload) } else if (configuration.isAlarmArming()) { setArmingMode(payload, delay) } @@ -376,48 +376,10 @@ class ControlsFragment : BaseFragment() { } } - /** - * We want to show a pending view when alarm is armed and entry occurs. - */ - private fun setPendingMode(state: String, delay: Int?) { - viewModel.setAlarmMode(state) - startCountdown(getPendingTime(configuration.alarmMode, delay)) - when (configuration.alarmMode) { - COMMAND_ARM_HOME -> { - hideAlarmStates() - armHomeLayout.visibility = View.VISIBLE - alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_yellow_alpha)) - } - COMMAND_ARM_AWAY -> { - hideAlarmStates() - armAwayLayout.visibility = View.VISIBLE - alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_red_alpha)) - } - COMMAND_ARM_NIGHT -> { - hideAlarmStates() - armNightLayout.visibility = View.VISIBLE - alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_black_alpha)) - } - COMMAND_ARM_CUSTOM_BYPASS, - STATE_ARM_CUSTOM_BYPASS -> { - hideAlarmStates() - armBypassLayout.visibility = View.VISIBLE - alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_blue_alpha)) - } - STATE_PENDING -> { - disabledLayout.visibility = View.VISIBLE - if (configuration.isAlarmDisarmedMode()) { - alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_gray_alpha)) - } - } - } - showAlarmIcons() - } - // TODO show the disarm dialog? - private fun setEntryMode(delay: Int?) { + private fun setEntryMode(state: String) { alarmText.text = getString(R.string.text_alarm_entry) - startCountdown(getPendingTime(configuration.alarmMode, delay), true) + playContinuousAlarm() when (configuration.alarmMode) { COMMAND_ARM_HOME, STATE_ARMED_HOME -> { @@ -439,6 +401,7 @@ class ControlsFragment : BaseFragment() { alarmStateLayout.setBackgroundDrawable(resources.getDrawable(R.drawable.button_round_gray_alpha)) } } + //viewModel.setAlarmMode(state) } private fun setDisarmingMode(state: String) { @@ -652,10 +615,8 @@ class ControlsFragment : BaseFragment() { } private fun stopCountdown() { - if (countDownTimer != null) { - countDownTimer!!.cancel() - countDownTimer = null - } + countDownTimer?.cancel() + countDownTimer = null countDownTimeRemaining = 0 destroySoundUtils() countDownProgressWheel?.visibility = View.GONE @@ -725,10 +686,12 @@ class ControlsFragment : BaseFragment() { } private fun playContinuousBeep() { - pendingSoundFlag = false - mediaPlayer = MediaPlayer.create(requireContext(), R.raw.beep_loop) - mediaPlayer?.isLooping = true - mediaPlayer?.start() + pendingSoundFlag = true + if(pendingSoundFlag) { + mediaPlayer = MediaPlayer.create(requireContext(), R.raw.beep_loop) + mediaPlayer?.isLooping = true + mediaPlayer?.start() + } } companion object { diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/OptionsBottomSheetFragment.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/OptionsBottomSheetFragment.kt index 9f95c83..d8f6721 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/OptionsBottomSheetFragment.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/ui/fragments/OptionsBottomSheetFragment.kt @@ -92,6 +92,7 @@ class OptionsBottomSheetFragment(val listener: OptionsBottomSheetFragmentListene val dialog = dialog as BottomSheetDialog val bottomSheet = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout? val behavior = BottomSheetBehavior.from(bottomSheet!!) + behavior.isDraggable = false behavior.state = BottomSheetBehavior.STATE_EXPANDED } }) diff --git a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/utils/MqttUtils.kt b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/utils/MqttUtils.kt index a58b978..c42931f 100644 --- a/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/utils/MqttUtils.kt +++ b/app/src/main/java/com/thanksmister/iot/mqtt/alarmpanel/utils/MqttUtils.kt @@ -50,6 +50,7 @@ class MqttUtils { const val EVENT_INVALID_CODE = "invalid_code_provided" const val EVENT_NO_CODE = "no_code_provided" const val EVENT_ARM_FAILED = "failed_to_arm" + const val EVENT_TRIGGER = "trigger" const val EVENT_SYSTEM_DISABLED = "system_disabled" const val EVENT_COMMAND_NOT_ALLOWED = "command_not_allowed" const val EVENT_UNKNOWN = "unknown" diff --git a/app/src/main/res/layout-land/fragment_code_bottom_sheet.xml b/app/src/main/res/layout-land/fragment_code_bottom_sheet.xml index b6c81f8..d8df317 100644 --- a/app/src/main/res/layout-land/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout-land/fragment_code_bottom_sheet.xml @@ -161,13 +161,13 @@ android:layout_width="200dp" android:layout_height="200dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" - ProgressWheel:textSize="38sp" + ProgressWheel:textSize="48sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/keypadLayout" app:layout_constraintTop_toBottomOf="@id/codeDotsLayout" diff --git a/app/src/main/res/layout-sw600dp-land/fragment_code_bottom_sheet.xml b/app/src/main/res/layout-sw600dp-land/fragment_code_bottom_sheet.xml index 92750c7..d7a80e9 100644 --- a/app/src/main/res/layout-sw600dp-land/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout-sw600dp-land/fragment_code_bottom_sheet.xml @@ -162,13 +162,13 @@ android:layout_width="240dp" android:layout_height="240dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" - ProgressWheel:textSize="38sp" + ProgressWheel:textSize="48sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/keypadLayout" app:layout_constraintTop_toBottomOf="@id/codeDotsLayout" diff --git a/app/src/main/res/layout-sw600dp/fragment_code_bottom_sheet.xml b/app/src/main/res/layout-sw600dp/fragment_code_bottom_sheet.xml index 62d2e33..258e025 100644 --- a/app/src/main/res/layout-sw600dp/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout-sw600dp/fragment_code_bottom_sheet.xml @@ -168,17 +168,18 @@ android:layout_width="200dp" android:layout_height="200dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" - ProgressWheel:textSize="38sp" + ProgressWheel:textSize="48sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/keypadLayout" app:layout_constraintBottom_toBottomOf="parent" + tools:visibility="visible" android:visibility="invisible"/> \ No newline at end of file diff --git a/app/src/main/res/layout-sw720dp-land/fragment_code_bottom_sheet.xml b/app/src/main/res/layout-sw720dp-land/fragment_code_bottom_sheet.xml index ac45af4..25dbda7 100644 --- a/app/src/main/res/layout-sw720dp-land/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout-sw720dp-land/fragment_code_bottom_sheet.xml @@ -160,13 +160,13 @@ android:layout_width="240dp" android:layout_height="240dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" - ProgressWheel:textSize="38sp" + ProgressWheel:textSize="48sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/keypadLayout" app:layout_constraintTop_toBottomOf="@id/codeDotsLayout" diff --git a/app/src/main/res/layout-sw720dp/fragment_code_bottom_sheet.xml b/app/src/main/res/layout-sw720dp/fragment_code_bottom_sheet.xml index a887f10..bd9dac9 100644 --- a/app/src/main/res/layout-sw720dp/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout-sw720dp/fragment_code_bottom_sheet.xml @@ -168,13 +168,13 @@ android:layout_width="200dp" android:layout_height="200dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" - ProgressWheel:textSize="38sp" + ProgressWheel:textSize="48sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/keypadLayout" diff --git a/app/src/main/res/layout/fragment_code_bottom_sheet.xml b/app/src/main/res/layout/fragment_code_bottom_sheet.xml index a9caefe..7aa1ca7 100644 --- a/app/src/main/res/layout/fragment_code_bottom_sheet.xml +++ b/app/src/main/res/layout/fragment_code_bottom_sheet.xml @@ -165,11 +165,11 @@ android:layout_width="200dp" android:layout_height="200dp" ProgressWheel:barColor="@color/green" - ProgressWheel:barWidth="2dp" + ProgressWheel:barWidth="8dp" ProgressWheel:contourColor="@color/gray_color" ProgressWheel:rimColor="@color/gray_color" - ProgressWheel:rimWidth="4dp" - ProgressWheel:textColor="@color/text" + ProgressWheel:rimWidth="8dp" + ProgressWheel:textColor="@color/dark_gray_color" tools:text="60" ProgressWheel:textSize="38sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e11af96..2d3daee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -454,7 +454,7 @@ Command not allowed, system arming. An invalid code has been entered, check the code and try again. An unknown error has occurred, please check the server. - Unable to arm system, please check settings. + Unable to arm system, please check if a sensor is open or the alarm settings. Please check sensors. One or more of your alarm sensors are active, the alarm cannot be set. Custom Bypass Pending Time Custom Bypass Delay Time