From fa40890202e1c66892c7a3f87a2092159d070fd1 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 31 Aug 2016 16:57:58 -0700 Subject: [PATCH] Added type parameter. --- README.md | 24 ++++++++++--------- .../tesremoteprogrammer/MainActivity.kt | 12 ++++++---- .../ProgrammingActivity.kt | 12 +++++----- .../tesremoteprogrammer/models/Field.kt | 8 +++---- .../tesremoteprogrammer/models/Params.kt | 5 +++- .../android/tesremoteprogrammer/util/Dtmf.kt | 14 +++++------ app/src/main/res/raw/dks_1802.json | 1 + app/src/main/res/raw/dks_1802_epd.json | 15 ++++++------ app/src/main/res/raw/dks_1803_1808_1810.json | 1 + app/src/main/res/raw/dks_1812.json | 1 + app/src/main/res/raw/dks_1819.json | 1 + app/src/main/res/raw/linear_ae_100.json | 9 +++---- app/src/main/res/raw/linear_ae_500.json | 9 +++---- 13 files changed, 63 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 36096ab..e32abc2 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Parameters define the configuration's global settings. ```json "params": { "name": "DKS 1802-EPD", + "type": "dks" "ack": "*", "alt": "#", "end": "0 + #", @@ -54,14 +55,15 @@ Parameters define the configuration's global settings. } ``` -| Property | Description | Required | -|:---------|:-------------------------------------------------------------------------------------------------|:---------| -|`name` | The name of the configuration. | Yes | -|`ack` | The key used to acknowledge or terminate programming steps. Most systems use the `*` or `#` key. | Yes | -|`alt` | They key used to in place of numbers when applicable. DKS systems use the `#` key | No | -|`begin` | The begin programming manual sequence. For example Linear uses `0` and `2` pressed together. | No | -|`end` | The end programming manual sequence. For example DSK uses `0` and `#` pressed together. | No | -|`size` | The size (number of digits) of the master code. Most systems use 4 or 6. | Yes | +| Property | Description | Required | +|:---------|:--------------------------------------------------------------------------------------------------|:---------| +|`name` | The name of the configuration. | Yes | +|`type` | The system's type, either `dks` or `linear`. | Yes | +|`ack` | The key used to acknowledge or terminate programming steps. Most systems use the `*` or `#` keys. | Yes | +|`alt` | They key used to in place of numbers when applicable. DKS systems use the `#` key | No | +|`begin` | The begin programming manual sequence. (e.g. Linear uses `0` and `2` pressed together) | No | +|`end` | The end programming manual sequence. (e.g. DSK uses `0` and `#` pressed together.) | No | +|`size` | The size (number of digits) of the master code. Most systems use 4 or 6. | Yes | ### Options @@ -133,10 +135,10 @@ Fields represent the data entry text fields on option screens. |`minSize` | Set the minimum size of the field. If set, `size` is the maximum size of the field. | No | |`min` | Set the minimum value of a numeric field. | No | |`max` | Set the maximum value of a numeric field. | No | -|`alpha` | Set to `dks` or `linear` for alphanumeric fields. | No | -|`digits` | Set digits that are allowed. For example DKS uses `1234567` for days of the week: Sun=1... Sat=7. | No | +|`alpha` | Set to `true` for alphanumeric fields. | No | +|`digits` | Set digits that are allowed. (e.g. DKS uses `1234567` for days of the week: Sun=1... Sat=7) | No | |`alt` | Set to `true` if the field accepts the `alt` [parameter](#parameters) value in place of a digit. | No | -|`zeros` | Set to `true` by default. Allows numeric values with leading zeros (i.e. `001`), based on the `size`. | No | +|`zeros` | Set to `true` by default. Allows numeric values with leading zeros (e.g. `001`), based on the `size`. | No | #### DTMF diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/MainActivity.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/MainActivity.kt index 4f48ab7..43dea8d 100644 --- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/MainActivity.kt +++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/MainActivity.kt @@ -347,6 +347,12 @@ class MainActivity : AppCompatActivity(), AnkoLogger { errors.append(getString(R.string.validate_missing_param, "name")) } + if (params.type.isBlank()) { + errors.append(getString(R.string.validate_missing_param, "type")) + } else if (!Dtmf.isValidType(params.type)) { + errors.append(getString(R.string.validate_invalid_param, "type")) + } + if (params.size < 1) { errors.append(getString(R.string.validate_invalid_param, "size")) } @@ -387,11 +393,7 @@ class MainActivity : AppCompatActivity(), AnkoLogger { errors.append(getString(R.string.validate_invalid_attr, i + 1, j + 1, "digits")) } - if (!Dtmf.isValidAlpha(field.alpha)) { - errors.append(getString(R.string.validate_invalid_attr, i + 1, j + 1, "alpha")) - } - - if (field.alpha.isBlank()) { + if (!field.alpha) { if (field.min >= 0 || field.max >= 0) { if (field.max < 1) { errors.append(getString(R.string.validate_invalid_attr, i + 1, j + 1, "max")) diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/ProgrammingActivity.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/ProgrammingActivity.kt index 2291730..b3d80e6 100644 --- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/ProgrammingActivity.kt +++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/ProgrammingActivity.kt @@ -98,11 +98,11 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger { val editText = editText() { hint = field.hint - if (field.alpha.isNotBlank()) { - if (field.alpha.equals(Dtmf.DKS, true)) { + if (field.alpha) { + if (params.type.equals(Dtmf.DKS, true)) { inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS inputFilters.add(AlphaFilter(Dtmf.DKS_EXTRAS)) - } else if (field.alpha.equals(Dtmf.LINEAR, true)) { + } else if (params.type.equals(Dtmf.LINEAR, true)) { inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES inputFilters.add(AlphaFilter(Dtmf.LINEAR_EXTRAS)) } @@ -153,7 +153,7 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger { onClick { if (validateFields(fields, option)) { - val dtmf = Dtmf.build(params.master, params.ack, option, fields) + val dtmf = Dtmf.build(params.type, params.master, params.ack, option, fields) if (Dtmf.validate(dtmf, "${MainActivity.PAUSE}${params.ack}${params.alt}")) { val begin = if (params.begin.isNotBlank()) { "${params.begin}${MainActivity.PAUSE}" @@ -198,7 +198,7 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger { imageResource = R.drawable.fab_ic_call onClick { if (validateFields(fields, option)) { - val dtmf = Dtmf.build(params.master, params.ack, option, fields) + val dtmf = Dtmf.build(params.type, params.master, params.ack, option, fields) if (Dtmf.validate(dtmf, "${MainActivity.PAUSE}${params.ack}${params.alt}")) { ProgrammingActivityPermissionsDispatcher.callWithCheck( this@ProgrammingActivity, params.phone, dtmf) @@ -250,7 +250,7 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger { } else { option.fields[i].size } - if (option.fields[i].alpha.isBlank() && + if (!option.fields[i].alpha && !validateSize(v.length(), option.fields[i].minSize, option.fields[i].size)) { v.error = getString(R.string.error_invalid_size, size, resources.getQuantityString(R.plurals.error_digit, size)) diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Field.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Field.kt index 06a23b1..c5ac5c9 100644 --- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Field.kt +++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Field.kt @@ -22,8 +22,8 @@ import android.os.Parcelable import java.io.Serializable data class Field(var hint: String, - var alpha: String, var digits: String, + var alpha: Boolean, val alt: Boolean, var zeros: Boolean, var minSize: Int, @@ -40,12 +40,12 @@ data class Field(var hint: String, } } - constructor() : this("", "", "", false, true, -1, -1, -1, -1) + constructor() : this("", "", false, false, true, -1, -1, -1, -1) constructor(source: Parcel) : this( source.readString(), source.readString(), - source.readString(), + 1.equals(source.readInt()), 1.equals(source.readInt()), 1.equals(source.readInt()), source.readInt(), @@ -57,8 +57,8 @@ data class Field(var hint: String, override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(hint) - dest?.writeString(alpha) dest?.writeString(digits) + dest?.writeInt((if (alpha) 1 else 0)) dest?.writeInt((if (alt) 1 else 0)) dest?.writeInt((if (zeros) 1 else 0)) dest?.writeInt(minSize) diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Params.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Params.kt index d9142bb..f0bcc82 100644 --- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Params.kt +++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Params.kt @@ -22,6 +22,7 @@ import android.os.Parcelable import java.io.Serializable data class Params(var name: String, + var type: String, var phone: String, var master: String, var size: Int, @@ -39,12 +40,13 @@ data class Params(var name: String, } } - constructor() : this("", "", "", -1, "", "", "", "") + constructor() : this("", "", "", "", -1, "", "", "", "") constructor(source: Parcel) : this( source.readString(), source.readString(), source.readString(), + source.readString(), source.readInt(), source.readString(), source.readString(), @@ -55,6 +57,7 @@ data class Params(var name: String, override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(name) + dest?.writeString(type) dest?.writeString(phone) dest?.writeString(master) dest?.writeInt(size) diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/util/Dtmf.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/util/Dtmf.kt index 9d4cf97..bbe7cac 100644 --- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/util/Dtmf.kt +++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/util/Dtmf.kt @@ -87,8 +87,8 @@ class Dtmf { return result.toString() } - fun isValidAlpha(alpha: String) : Boolean { - return alpha.isBlank() || alpha.equals(DKS, true) || alpha.equals(LINEAR, true) + fun isValidType(type: String): Boolean { + return type.equals(DKS, true) || type.equals(LINEAR, true) } @@ -152,7 +152,8 @@ class Dtmf { return result.toString() } - fun build(master: String, + fun build(type: String, + master: String, ack: String, option: Option, fields: ArrayList): String { @@ -160,12 +161,11 @@ class Dtmf { fields.forEachIndexed { i, field -> replace.add(Pair(DTMF_FIELD.format(i + 1), - if (option.fields[i].alpha.equals(DKS, true)) { + if (type.equals(DKS, true)) { dksAlphaToDigits(field.text.toString(), ack) - } else if (option.fields[i].alpha.equals(LINEAR, true)) { + } else if (type.equals(LINEAR, true)) { linearAlphaToDigits(field.text.toString()) - } - else { + } else { field.text.toString() })) } diff --git a/app/src/main/res/raw/dks_1802.json b/app/src/main/res/raw/dks_1802.json index 67b74c8..e77d8af 100644 --- a/app/src/main/res/raw/dks_1802.json +++ b/app/src/main/res/raw/dks_1802.json @@ -1,6 +1,7 @@ { "params": { "name": "DKS 1802", + "type": "dks", "ack": "*", "alt": "#", "end": "0 + #", diff --git a/app/src/main/res/raw/dks_1802_epd.json b/app/src/main/res/raw/dks_1802_epd.json index 2b7b5f1..570550b 100644 --- a/app/src/main/res/raw/dks_1802_epd.json +++ b/app/src/main/res/raw/dks_1802_epd.json @@ -1,6 +1,7 @@ { "params": { "name": "DKS 1802-EPD", + "type": "dks", "ack": "*", "alt": "#", "end": "0 + #", @@ -533,7 +534,7 @@ { "hint": "Name", "size": 11, - "alpha": "dks" + "alpha": true } ], "nodial": true, @@ -545,17 +546,17 @@ { "hint": "Message (Line 1)", "size": 16, - "alpha": "dks" + "alpha": true }, { "hint": "Message (Line 2)", "size": 16, - "alpha": "dks" + "alpha": true }, { "hint": "Message (Line 3)", "size": 16, - "alpha": "dks" + "alpha": true } ], "nodial": true, @@ -567,17 +568,17 @@ { "hint": "Message (Line 1)", "size": 16, - "alpha": "dks" + "alpha": true }, { "hint": "Message (Line 2)", "size": 16, - "alpha": "dks" + "alpha": true }, { "hint": "Message (Line 3)", "size": 16, - "alpha": "dks" + "alpha": true } ], "nodial": true, diff --git a/app/src/main/res/raw/dks_1803_1808_1810.json b/app/src/main/res/raw/dks_1803_1808_1810.json index 9131fbc..9804d9e 100644 --- a/app/src/main/res/raw/dks_1803_1808_1810.json +++ b/app/src/main/res/raw/dks_1803_1808_1810.json @@ -1,6 +1,7 @@ { "params": { "name": "DKS 1803/1808/1810", + "type": "dks", "ack": "*", "alt": "#", "end": "0 + #", diff --git a/app/src/main/res/raw/dks_1812.json b/app/src/main/res/raw/dks_1812.json index 883ee0a..be8f4b1 100644 --- a/app/src/main/res/raw/dks_1812.json +++ b/app/src/main/res/raw/dks_1812.json @@ -1,6 +1,7 @@ { "params": { "name": "DKS 1812", + "type": "dks", "ack": "*", "alt": "#", "end": "0 + #", diff --git a/app/src/main/res/raw/dks_1819.json b/app/src/main/res/raw/dks_1819.json index 28278d5..026188d 100644 --- a/app/src/main/res/raw/dks_1819.json +++ b/app/src/main/res/raw/dks_1819.json @@ -1,6 +1,7 @@ { "params": { "name": "DKS 1819", + "type": "dks", "ack": "*", "alt": "#", "end": "0 + #", diff --git a/app/src/main/res/raw/linear_ae_100.json b/app/src/main/res/raw/linear_ae_100.json index 5715a93..63ab52f 100644 --- a/app/src/main/res/raw/linear_ae_100.json +++ b/app/src/main/res/raw/linear_ae_100.json @@ -1,6 +1,7 @@ { "params": { "name": "Linear AE-100", + "type": "linear", "ack": "#", "begin": "0 + 2", "size": 6 @@ -22,7 +23,7 @@ { "hint": "Name", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Phone", @@ -51,7 +52,7 @@ { "hint": "Name", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Phone", @@ -124,12 +125,12 @@ { "hint": "Line 1", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Line 2", "size": 16, - "alpha": "linear" + "alpha": true } ], "dtmf": "[FIELD:1]#,[MASTER]#,57#,[FIELD:2]#,[FIELD:3]#,99#" diff --git a/app/src/main/res/raw/linear_ae_500.json b/app/src/main/res/raw/linear_ae_500.json index a79bacc..0f394a3 100644 --- a/app/src/main/res/raw/linear_ae_500.json +++ b/app/src/main/res/raw/linear_ae_500.json @@ -1,6 +1,7 @@ { "params": { "name": "Linear AE-500", + "type": "linear", "ack": "#", "begin": "0 + 2", "size": 6 @@ -22,7 +23,7 @@ { "hint": "Name", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Phone", @@ -51,7 +52,7 @@ { "hint": "Name", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Phone", @@ -166,12 +167,12 @@ { "hint": "Line 1", "size": 16, - "alpha": "linear" + "alpha": true }, { "hint": "Line 2", "size": 16, - "alpha": "linear" + "alpha": true } ], "dtmf": "[FIELD:1]#,[MASTER]#,57#,[FIELD:2]#,[FIELD:3]#,99#"