Skip to content

Commit

Permalink
* added hack for missing pending w/delay state from alarmo (sends tri…
Browse files Browse the repository at this point in the history
…gger instead)

* fixed issue displaying countdown timer on pending when entry detected
* fixed alarm sound when entry detected
* removed dragging ability from code bottom sheet
  • Loading branch information
thanksmister committed May 24, 2021
1 parent f7aca7b commit c0b6177
Show file tree
Hide file tree
Showing 14 changed files with 208 additions and 171 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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 -> {
Expand All @@ -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,
Expand All @@ -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)
}
}
}
}
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"
Expand All @@ -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"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down Expand Up @@ -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()
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand All @@ -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() {
Expand All @@ -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() {
Expand Down Expand Up @@ -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)
}
}
}
Expand Down
Loading

0 comments on commit c0b6177

Please sign in to comment.