diff --git a/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.kt
index 580b693..708c6ac 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/AddSiteActivity.kt
@@ -38,6 +38,7 @@ import com.afollestad.nocknock.utilities.ext.textAsLong
import com.afollestad.nocknock.utilities.ext.trimmedText
import kotlinx.android.synthetic.main.activity_addsite.checkIntervalInput
import kotlinx.android.synthetic.main.activity_addsite.checkIntervalSpinner
+import kotlinx.android.synthetic.main.activity_addsite.content_loading_progress
import kotlinx.android.synthetic.main.activity_addsite.doneBtn
import kotlinx.android.synthetic.main.activity_addsite.inputName
import kotlinx.android.synthetic.main.activity_addsite.inputUrl
@@ -199,7 +200,6 @@ class AddSiteActivity : AppCompatActivity(), View.OnClickListener {
// Done button
override fun onClick(view: View) {
isClosing = true
-
var model = ServerModel(
name = inputName.trimmedText(),
url = inputUrl.trimmedText(),
@@ -259,13 +259,20 @@ class AddSiteActivity : AppCompatActivity(), View.OnClickListener {
validationContent = responseValidationScriptInput.trimmedText()
)
}
+ else -> {
+ throw IllegalStateException(
+ "Unexpected validation mode index: ${responseValidationMode.selectedItemPosition}"
+ )
+ }
}
rootView.scopeWhileAttached(Main) {
launch(coroutineContext) {
+ content_loading_progress.show()
val storedModel = async(IO) { serverModelStore.put(model) }.await()
checkStatusManager.cancelCheck(storedModel)
checkStatusManager.scheduleCheck(storedModel, rightNow = true)
+ content_loading_progress.hide()
setResult(RESULT_OK)
finish()
diff --git a/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
index adb119b..09954a5 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/MainActivity.kt
@@ -85,6 +85,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
when (intent.action) {
ACTION_STATUS_UPDATE -> {
val model = intent.getSerializableExtra(KEY_UPDATE_MODEL) as? ServerModel ?: return
+ log("Received model update: $model")
list.post { adapter.update(model) }
}
else -> throw IllegalStateException("Unexpected intent: ${intent.action}")
diff --git a/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.kt
index df5f19f..c280404 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/ViewSiteActivity.kt
@@ -24,6 +24,7 @@ import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.nocknock.BuildConfig
import com.afollestad.nocknock.R
import com.afollestad.nocknock.data.ServerModel
+import com.afollestad.nocknock.data.ServerStatus.CHECKING
import com.afollestad.nocknock.data.ServerStatus.WAITING
import com.afollestad.nocknock.data.ValidationMode.JAVASCRIPT
import com.afollestad.nocknock.data.ValidationMode.STATUS_CODE
@@ -42,6 +43,8 @@ import com.afollestad.nocknock.utilities.ext.hide
import com.afollestad.nocknock.utilities.ext.injector
import com.afollestad.nocknock.utilities.ext.isHttpOrHttps
import com.afollestad.nocknock.utilities.ext.onItemSelected
+import com.afollestad.nocknock.utilities.ext.safeRegisterReceiver
+import com.afollestad.nocknock.utilities.ext.safeUnregisterReceiver
import com.afollestad.nocknock.utilities.ext.scopeWhileAttached
import com.afollestad.nocknock.utilities.ext.show
import com.afollestad.nocknock.utilities.ext.showOrHide
@@ -49,6 +52,7 @@ import com.afollestad.nocknock.utilities.ext.textAsLong
import com.afollestad.nocknock.utilities.ext.trimmedText
import kotlinx.android.synthetic.main.activity_viewsite.checkIntervalInput
import kotlinx.android.synthetic.main.activity_viewsite.checkIntervalSpinner
+import kotlinx.android.synthetic.main.activity_viewsite.content_loading_progress
import kotlinx.android.synthetic.main.activity_viewsite.doneBtn
import kotlinx.android.synthetic.main.activity_viewsite.iconStatus
import kotlinx.android.synthetic.main.activity_viewsite.inputName
@@ -106,7 +110,8 @@ class ViewSiteActivity : AppCompatActivity(),
val model = intent.getSerializableExtra(KEY_VIEW_MODEL) as? ServerModel
if (model != null) {
this@ViewSiteActivity.currentModel = model
- update()
+ log("Received model update: $currentModel")
+ displayCurrentModel()
}
}
}
@@ -177,19 +182,19 @@ class ViewSiteActivity : AppCompatActivity(),
}
currentModel = intent.getSerializableExtra(KEY_VIEW_MODEL) as ServerModel
- update()
+ displayCurrentModel()
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
if (intent != null && intent.hasExtra(KEY_VIEW_MODEL)) {
currentModel = intent.getSerializableExtra(KEY_VIEW_MODEL) as ServerModel
- update()
+ displayCurrentModel()
}
}
@SuppressLint("SetTextI18n")
- private fun update() = with(currentModel) {
+ private fun displayCurrentModel() = with(currentModel) {
iconStatus.setStatus(this.status)
inputName.setText(this.name)
inputUrl.setText(this.url)
@@ -260,27 +265,20 @@ class ViewSiteActivity : AppCompatActivity(),
}
doneBtn.setOnClickListener(this@ViewSiteActivity)
+ invalidateMenuForStatus()
}
override fun onResume() {
super.onResume()
- try {
- val filter = IntentFilter()
- filter.addAction(ACTION_STATUS_UPDATE)
- // filter.addAction(CheckService.ACTION_JOB_RUNNING);
- registerReceiver(intentReceiver, filter)
- } catch (t: Throwable) {
- t.printStackTrace()
+ val filter = IntentFilter().apply {
+ addAction(ACTION_STATUS_UPDATE)
}
+ safeRegisterReceiver(intentReceiver, filter)
}
override fun onPause() {
super.onPause()
- try {
- unregisterReceiver(intentReceiver)
- } catch (t: Throwable) {
- t.printStackTrace()
- }
+ safeUnregisterReceiver(intentReceiver)
}
private fun updateModelFromInput(withValidation: Boolean) {
@@ -345,6 +343,11 @@ class ViewSiteActivity : AppCompatActivity(),
validationContent = responseValidationScriptInput.trimmedText()
)
}
+ else -> {
+ throw IllegalStateException(
+ "Unexpected response validation mode index: ${responseValidationMode.selectedItemPosition}"
+ )
+ }
}
}
@@ -352,8 +355,14 @@ class ViewSiteActivity : AppCompatActivity(),
override fun onClick(view: View) {
rootView.scopeWhileAttached(Main) {
launch(coroutineContext) {
+ content_loading_progress.show()
updateModelFromInput(true)
+
async(IO) { serverModelStore.update(currentModel) }.await()
+ checkStatusManager.cancelCheck(currentModel)
+ checkStatusManager.scheduleCheck(currentModel, rightNow = true)
+
+ content_loading_progress.hide()
setResult(RESULT_OK)
finish()
}
@@ -365,26 +374,29 @@ class ViewSiteActivity : AppCompatActivity(),
R.id.refresh -> {
rootView.scopeWhileAttached(Main) {
launch(coroutineContext) {
+ content_loading_progress.show()
updateModelFromInput(false)
+ currentModel = currentModel.copy(status = WAITING)
+ displayCurrentModel()
+
async(IO) { serverModelStore.update(currentModel) }.await()
+
checkStatusManager.cancelCheck(currentModel)
checkStatusManager.scheduleCheck(currentModel, rightNow = true)
+ content_loading_progress.hide()
}
}
return true
}
R.id.remove -> {
- maybeRemoveSite(currentModel) { finish() }
+ maybeRemoveSite(currentModel)
return true
}
}
return false
}
- private fun maybeRemoveSite(
- model: ServerModel,
- onRemoved: (() -> Unit)?
- ) {
+ private fun maybeRemoveSite(model: ServerModel) {
MaterialDialog(this).show {
title(R.string.remove_site)
message(
@@ -396,21 +408,25 @@ class ViewSiteActivity : AppCompatActivity(),
positiveButton(R.string.remove) {
checkStatusManager.cancelCheck(model)
notificationManager.cancelStatusNotifications()
- performRemoveSite(model, onRemoved)
+ performRemoveSite(model)
}
negativeButton(android.R.string.cancel)
}
}
- private fun performRemoveSite(
- model: ServerModel,
- onRemoved: (() -> Unit)?
- ) {
+ private fun performRemoveSite(model: ServerModel) {
rootView.scopeWhileAttached(Main) {
launch(coroutineContext) {
+ content_loading_progress.show()
async(IO) { serverModelStore.delete(model) }.await()
- onRemoved?.invoke()
+ content_loading_progress.hide()
+ finish()
}
}
}
+
+ private fun invalidateMenuForStatus() {
+ val item = toolbar.menu.findItem(R.id.refresh)
+ item.isEnabled = currentModel.status != CHECKING && currentModel.status != WAITING
+ }
}
diff --git a/app/src/main/res/layout/activity_addsite.xml b/app/src/main/res/layout/activity_addsite.xml
index a03096c..e2aaae8 100644
--- a/app/src/main/res/layout/activity_addsite.xml
+++ b/app/src/main/res/layout/activity_addsite.xml
@@ -1,270 +1,294 @@
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_viewsite.xml b/app/src/main/res/layout/activity_viewsite.xml
index 7697c61..d3d32b5 100644
--- a/app/src/main/res/layout/activity_viewsite.xml
+++ b/app/src/main/res/layout/activity_viewsite.xml
@@ -1,329 +1,354 @@
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/engine/src/main/java/com/afollestad/nocknock/engine/statuscheck/CheckStatusJob.kt b/engine/src/main/java/com/afollestad/nocknock/engine/statuscheck/CheckStatusJob.kt
index 99eca0d..6f8a4c4 100644
--- a/engine/src/main/java/com/afollestad/nocknock/engine/statuscheck/CheckStatusJob.kt
+++ b/engine/src/main/java/com/afollestad/nocknock/engine/statuscheck/CheckStatusJob.kt
@@ -160,7 +160,7 @@ class CheckStatusJob : JobService() {
modelStore.update(newSiteModel)
withContext(Main) {
- sendBroadcast(Intent(ACTION_STATUS_UPDATE).apply { putExtra(KEY_UPDATE_MODEL, site) })
+ sendBroadcast(Intent(ACTION_STATUS_UPDATE).apply { putExtra(KEY_UPDATE_MODEL, newSiteModel) })
}
return newSiteModel
}