diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 30aa626..681f41a 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,29 +1,116 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3963879..854c318 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,26 +5,41 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index 443e88a..7b51672 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,21 +1,20 @@
plugins {
- id "org.jlleitschuh.gradle.ktlint" version "6.2.1"
+ id 'com.android.application'
+ id 'kotlin-android'
+ id 'kotlin-android-extensions'
+ id 'kotlin-kapt'
+ id 'org.jmailen.kotlinter' version '2.1.1'
+ id 'com.github.ben-manes.versions' version '0.25.0'
}
-//noinspection GradleCompatible
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-apply plugin: 'kotlin-kapt'
-
android {
- compileSdkVersion 27
+ compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "net.thauvin.erik.android.tesremoteprogrammer"
- minSdkVersion 21
- targetSdkVersion 27
+ minSdkVersion 26
+ targetSdkVersion 28
versionCode 1
versionName "1.0"
buildConfigField "long", "TIMESTAMP", System.currentTimeMillis() + "L"
@@ -32,8 +31,8 @@ android {
}
ext {
- anko_version = '0.10.7'
- support_version = "27.1.1"
+ anko_version = '0.10.8'
+ support_version = "28.0.0"
}
dependencies {
@@ -54,9 +53,6 @@ dependencies {
// https://github.com/JakeWharton/ViewPagerIndicator
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
- // https://github.com/AndroidDeveloperLB/AutoFitTextView
- implementation 'com.github.AndroidDeveloperLB:AutoFitTextView:4'
-
// https://github.com/hotchemi/PermissionsDispatcher
// Version 4.x does not work.
implementation 'com.github.hotchemi:permissionsdispatcher:3.3.1'
@@ -82,3 +78,10 @@ repositories {
kapt {
//generateStubs = true
}
+
+kotlinter {
+ ignoreFailures = false
+ reporters = ['html']
+ experimentalRules = false
+ disabledRules = ['import-ordering']
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fa76875..f6839c7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,22 +1,22 @@
+ package="net.thauvin.erik.android.tesremoteprogrammer">
-
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
+
@@ -24,21 +24,21 @@
+ android:name=".MainActivity"
+ android:screenOrientation="portrait" />
+ android:name=".ProgrammingActivity"
+ android:screenOrientation="portrait" />
+ android:name=".StepsActivity"
+ android:screenOrientation="landscape" />
+ android:name=".reporting.CrashReportActivity"
+ android:excludeFromRecents="true"
+ android:finishOnTaskLaunch="true"
+ android:launchMode="singleInstance"
+ android:process=":error_report" />
-
\ No newline at end of file
+
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/App.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/App.kt
index e9e7fc3..c4ab1f7 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/App.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/App.kt
@@ -1,7 +1,7 @@
/*
* App.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,13 +25,16 @@ import org.acra.ACRA
import org.acra.ReportingInteractionMode
import org.acra.annotation.ReportsCrashes
-@ReportsCrashes(mailTo = "erik@thauvin.net",
+@Suppress("unused")
+@ReportsCrashes(
+ mailTo = "erik@thauvin.net",
mode = ReportingInteractionMode.DIALOG,
reportSenderFactoryClasses = [CrashEmailFactory::class],
- reportDialogClass = CrashReportActivity::class)
+ reportDialogClass = CrashReportActivity::class
+)
open class App : Application() {
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
ACRA.init(this)
}
-}
\ No newline at end of file
+}
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 d4ea0f7..9292d95 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
@@ -1,7 +1,7 @@
/*
* MainActivity.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,13 +24,11 @@ import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.graphics.Typeface
-import android.os.Build
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.text.Html
import android.text.InputFilter
import android.text.InputType
-import android.text.Spanned
import android.text.TextUtils
import android.util.TypedValue
import android.view.Menu
@@ -89,7 +87,8 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
R.raw.dks_1819,
R.raw.linear_ae_100,
R.raw.linear_ae_500,
- R.raw.dks_1803_1808_1810)
+ R.raw.dks_1803_1808_1810
+ )
private val readRequestCode = 42
companion object {
@@ -97,14 +96,7 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
const val QUOTE = "'"
}
- private fun fromHtml(s: String): Spanned {
- if (Build.VERSION.SDK_INT >= 24) {
- return Html.fromHtml(s, Html.FROM_HTML_MODE_LEGACY)
- } else {
- @Suppress("DEPRECATION")
- return Html.fromHtml(s)
- }
- }
+ private fun fromHtml(s: String) = Html.fromHtml(s, Html.FROM_HTML_MODE_LEGACY)
private fun initConfigurations() {
try {
@@ -115,8 +107,10 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
val confs = Configurations()
defaultConfigurations.forEach {
- config = Gson().fromJson(InputStreamReader(resources.openRawResource(it)),
- Config::class.java)
+ config = Gson().fromJson(
+ InputStreamReader(resources.openRawResource(it)),
+ Config::class.java
+ )
if (BuildConfig.DEBUG) {
val errors = StringBuilder()
@@ -145,7 +139,8 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
extraTitle = "Last Update"
extra = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(
- Date(BuildConfig.TIMESTAMP)).toString()
+ Date(BuildConfig.TIMESTAMP)
+ ).toString()
emailAddress = "erik@thauvin.net"
emailSubject = "${getString(R.string.app_name)} ${BuildConfig.VERSION_NAME} Support"
@@ -172,8 +167,10 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
val errors = StringBuilder()
val tmp: Config? = try {
- Gson().fromJson(InputStreamReader(contentResolver.openInputStream(intent.data)),
- Config::class.java)
+ Gson().fromJson(
+ InputStreamReader(contentResolver.openInputStream(intent.data!!)),
+ Config::class.java
+ )
} catch (jse: JsonSyntaxException) {
val cause = jse.cause
if (cause != null) {
@@ -221,7 +218,7 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
// config name
textView {
- text = name.toUpperCase()
+ text = name.toUpperCase(Locale.getDefault())
bottomPadding = dip(5)
typeface = Typeface.DEFAULT_BOLD
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 24f)
@@ -241,7 +238,12 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
setText(phone)
}
- setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_call_black_24dp, 0)
+ setCompoundDrawablesWithIntrinsicBounds(
+ 0,
+ 0,
+ R.drawable.ic_call_black_24dp,
+ 0
+ )
setOnFocusChangeListener { view, hasFocus ->
if (!hasFocus) {
phone = (view as EditText).text.toString()
@@ -259,7 +261,12 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD
hint = getString(R.string.hint_master_code)
filters = arrayOf(InputFilter.LengthFilter(size))
- setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_lock_question_black_24dp, 0)
+ setCompoundDrawablesWithIntrinsicBounds(
+ 0,
+ 0,
+ R.drawable.ic_lock_question_black_24dp,
+ 0
+ )
imeOptions = EditorInfo.IME_ACTION_DONE
if (master.isNotBlank()) {
@@ -303,7 +310,11 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
titles.add(it.title)
}
- adapter = ArrayAdapter(this@MainActivity, android.R.layout.simple_list_item_1, titles)
+ adapter = ArrayAdapter(
+ this@MainActivity,
+ android.R.layout.simple_list_item_1,
+ titles
+ )
isTextFilterEnabled = true
isScrollbarFadingEnabled = false
onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
@@ -311,7 +322,8 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
saveConfig()
startActivity(
"net.thauvin.erik.android.tesremoteprogrammer.models.Params" to config.params,
- "net.thauvin.erik.android.tesremoteprogrammer.models.Option" to opts[position])
+ "net.thauvin.erik.android.tesremoteprogrammer.models.Option" to opts[position]
+ )
}
}
}
@@ -444,129 +456,194 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
with(option) {
// title
if (title.isBlank()) {
- errors.append(getString(
- R.string.validate_missing_opts_prop,
- i + 1,
- "title"))
+ errors.append(
+ getString(
+ R.string.validate_missing_opts_prop,
+ i + 1,
+ "title"
+ )
+ )
}
// nosteps/nodial
if (nosteps && nodial) {
- errors.append(getString(
- R.string.validate_invalid_option,
- i + 1,
- "nodial/nosteps"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_option,
+ i + 1,
+ "nodial/nosteps"
+ )
+ )
}
// dtmf
if (dtmf.isBlank()) {
- errors.append(getString(
- R.string.validate_missing_opts_prop,
- i + 1,
- "dtmf"))
+ errors.append(
+ getString(
+ R.string.validate_missing_opts_prop,
+ i + 1,
+ "dtmf"
+ )
+ )
} else if (!nodial && fields.isEmpty()) { // fields missing
- errors.append(getString(
- R.string.validate_missing_opts_prop,
- i + 1,
- "fields"))
+ errors.append(
+ getString(
+ R.string.validate_missing_opts_prop,
+ i + 1,
+ "fields"
+ )
+ )
} else {
val blank = "\\0"
val mock = Dtmf.mock(option, blank)
- if (!mock.contains(MainActivity.PAUSE)) { // no pause
- errors.append(getString(
- R.string.validate_invalid_opts_prop,
- i + 1,
- "dtmf",
- getString(R.string.validate_dtmf_nopause)))
+ if (!mock.contains(PAUSE)) { // no pause
+ errors.append(
+ getString(
+ R.string.validate_invalid_opts_prop,
+ i + 1,
+ "dtmf",
+ getString(R.string.validate_dtmf_nopause)
+ )
+ )
}
- if (!Dtmf.validate(mock,
- "${MainActivity.PAUSE}${params.ack}${params.alt}$blank", nodial)) {
- errors.append(getString(
- R.string.validate_invalid_opts_prop,
- i + 1,
- "dtmf",
- mock.replace(blank, "✓")))
+ if (!Dtmf.validate(
+ mock,
+ "$PAUSE${params.ack}${params.alt}$blank", nodial
+ )) {
+ errors.append(
+ getString(
+ R.string.validate_invalid_opts_prop,
+ i + 1,
+ "dtmf",
+ mock.replace(blank, "✓")
+ )
+ )
}
}
// fields
fields.forEachIndexed { j, field ->
if (field == null) {
- errors.append(getString(
- R.string.validate_syntax_error,
- "opts[${i + 1}], field[$j]"))
+ errors.append(
+ getString(
+ R.string.validate_syntax_error,
+ "opts[${i + 1}], field[$j]"
+ )
+ )
} else {
with(field) {
// size
if (size <= 0) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 1),
- "size=$size"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 1
+ ),
+ "size=$size"
+ )
+ )
}
// digits
if (digits.isNotBlank() && !digits.isDigits()) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 1),
- "digits='$digits'"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 1
+ ),
+ "digits='$digits'"
+ )
+ )
}
// minSize
if (minSize >= 0 && minSize > size) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 2),
- "minSize=$minSize > size=$size"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 2
+ ),
+ "minSize=$minSize > size=$size"
+ )
+ )
}
// numeric fields only
if (!alpha) {
if (minSize == 0) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 1),
- "minSize=$minSize"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 1
+ ),
+ "minSize=$minSize"
+ )
+ )
}
// min/max
if (min >= 0 || max >= 0) {
if (max < 1) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 1),
- "max=$max"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 1
+ ),
+ "max=$max"
+ )
+ )
}
if (min < 0) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 1),
- "min=$min"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 1
+ ),
+ "min=$min"
+ )
+ )
}
if (min > max) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 2),
- "min=$min > max=$max"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 2
+ ),
+ "min=$min > max=$max"
+ )
+ )
}
}
@@ -575,24 +652,36 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
// minSize/min
if (min >= 0 && minSize > 0) {
if (min.toString().length != minSize) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 2),
- "minSize=$minSize/min=$min"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 2
+ ),
+ "minSize=$minSize/min=$min"
+ )
+ )
}
}
// size/max
if (size > 0 && max > 0) {
if (max.toString().length != size) {
- errors.append(getString(
- R.string.validate_invalid_field_prop,
- i + 1,
- j + 1,
- resources.getQuantityString(R.plurals.error_prop, 2),
- "size=$size/max=$max"))
+ errors.append(
+ getString(
+ R.string.validate_invalid_field_prop,
+ i + 1,
+ j + 1,
+ resources.getQuantityString(
+ R.plurals.error_prop,
+ 2
+ ),
+ "size=$size/max=$max"
+ )
+ )
}
}
}
@@ -600,10 +689,13 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
// unused fields
if (!dtmf.contains(Dtmf.DTMF_FIELD.format(j + 1))) {
- errors.append(getString(
- R.string.validate_unused_field,
- i + 1,
- j + 1))
+ errors.append(
+ getString(
+ R.string.validate_unused_field,
+ i + 1,
+ j + 1
+ )
+ )
}
}
}
@@ -626,8 +718,10 @@ class MainActivity : AppCompatActivity(), AnkoLogger {
first.error = getString(R.string.error_required)
isValid = false
} else if (second > 0 && first.text.length != second) {
- first.error = getString(R.string.error_invalid_size, second,
- resources.getQuantityString(R.plurals.error_digit, second), "")
+ first.error = getString(
+ R.string.error_invalid_size, second,
+ resources.getQuantityString(R.plurals.error_digit, second), ""
+ )
isValid = false
}
}
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 8c4bc5c..8c11891 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
@@ -1,7 +1,7 @@
/*
* ProgrammingActivity.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -77,8 +77,8 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- val params: Params = intent.extras.getParcelable("net.thauvin.erik.android.tesremoteprogrammer.models.Params")
- val option: Option = intent.extras.getParcelable("net.thauvin.erik.android.tesremoteprogrammer.models.Option")
+ val params: Params = intent.extras!!.getParcelable("net.thauvin.erik.android.tesremoteprogrammer.models.Params")
+ val option: Option = intent.extras!!.getParcelable("net.thauvin.erik.android.tesremoteprogrammer.models.Option")
val fields = arrayListOf()
coordinatorLayout {
@@ -135,14 +135,21 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger {
}
} else {
inputType = InputType.TYPE_CLASS_PHONE
- inputFilters.add(NumberFilter(field.digits, if (field.alt) params.alt else empty))
+ inputFilters.add(
+ NumberFilter(
+ field.digits,
+ if (field.alt) params.alt else empty
+ )
+ )
if (field.max != -1 && field.min != -1) {
inputFilters.add(
MinMaxFilter(
field.min,
field.max,
field.size,
- params.type.isDKS() || field.zeros))
+ params.type.isDKS() || field.zeros
+ )
+ )
}
}
@@ -196,8 +203,18 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger {
elevation = dip(6).toFloat()
}.setOnClickListener {
if (validateFields(params.type, fields, option)) {
- val dtmf = Dtmf.build(params.type, params.master, params.ack, option, fields)
- if (Dtmf.validate(dtmf, "${MainActivity.PAUSE}${params.ack}${params.alt}", option.nodial)) {
+ val dtmf = Dtmf.build(
+ params.type,
+ params.master,
+ params.ack,
+ option,
+ fields
+ )
+ if (Dtmf.validate(
+ dtmf,
+ "${MainActivity.PAUSE}${params.ack}${params.alt}",
+ option.nodial
+ )) {
val begin = if (params.begin.isNotBlank()) {
"${params.begin}${MainActivity.PAUSE}"
} else {
@@ -245,21 +262,40 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger {
}.setOnClickListener {
if (validateFieldsForCall(params.type, fields)) {
if (validateFields(params.type, fields, option)) {
- val dtmf = Dtmf.build(params.type, params.master, params.ack, option, fields)
- if (Dtmf.validate(dtmf, "${MainActivity.PAUSE}${params.ack}${params.alt}", option.nodial)) {
+ val dtmf = Dtmf.build(
+ params.type,
+ params.master,
+ params.ack,
+ option,
+ fields
+ )
+ if (Dtmf.validate(
+ dtmf,
+ "${MainActivity.PAUSE}${params.ack}${params.alt}",
+ option.nodial
+ )) {
callWithPermissionCheck(params.phone, dtmf)
} else {
- Snackbar.make(this@coordinatorLayout,
+ Snackbar.make(
+ this@coordinatorLayout,
getString(R.string.error_invalid_dtmf, dtmf),
- Snackbar.LENGTH_LONG).show()
+ Snackbar.LENGTH_LONG
+ ).show()
}
} else {
- Snackbar.make(this@coordinatorLayout, R.string.error_invalid_field,
- Snackbar.LENGTH_LONG).show()
+ Snackbar.make(
+ this@coordinatorLayout, R.string.error_invalid_field,
+ Snackbar.LENGTH_LONG
+ ).show()
}
} else {
val text = SpannableString(getString(R.string.error_invalid_field_for_call) + " ")
- text.setSpan(ImageSpan(context, R.drawable.ic_menu_dialpad_lt), text.length - 1, text.length, 0)
+ text.setSpan(
+ ImageSpan(context, R.drawable.ic_menu_dialpad_lt),
+ text.length - 1,
+ text.length,
+ 0
+ )
Snackbar.make(this@coordinatorLayout, text, Snackbar.LENGTH_LONG).show()
}
}
@@ -310,19 +346,25 @@ class ProgrammingActivity : AppCompatActivity(), AnkoLogger {
if (v.text.isNullOrBlank()) {
v.error = getString(R.string.error_required)
isValid = false
- } else if (!validateSize(v.length(), if ((!type.isDKS() && !zeros) && min >= 0) min.toString().length else minSize, size)) {
+ } else if (!validateSize(
+ v.length(),
+ if ((!type.isDKS() && !zeros) && min >= 0) min.toString().length else minSize,
+ size
+ )) {
if (minSize > 0) {
v.error = getString(
R.string.error_invalid_size,
minSize,
resources.getQuantityString(R.plurals.error_digit, minSize),
- getString(R.string.error_minimum))
+ getString(R.string.error_minimum)
+ )
} else {
v.error = getString(
R.string.error_invalid_size,
size,
resources.getQuantityString(R.plurals.error_digit, size),
- empty)
+ empty
+ )
}
isValid = false
} else if (min >= 0 && max > 0) {
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/SplashActivity.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/SplashActivity.kt
index d6b9b38..2556394 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/SplashActivity.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/SplashActivity.kt
@@ -1,7 +1,7 @@
/*
* SplashActivity.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,11 +22,10 @@ import android.support.v7.app.AppCompatActivity
import org.jetbrains.anko.startActivity
class SplashActivity : AppCompatActivity() {
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startActivity()
finish()
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsActivity.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsActivity.kt
index ffa0f2b..ad0ca39 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsActivity.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsActivity.kt
@@ -1,7 +1,7 @@
/*
* StepsActivity.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsFragment.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsFragment.kt
index a237eb1..adf5dbc 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsFragment.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/StepsFragment.kt
@@ -1,7 +1,7 @@
/*
* StepsFragment.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -63,7 +63,11 @@ class StepsFragment : Fragment() {
if (steps.isEmpty()) {
activity.finish()
} else {
- frag_steps_title.text = getString(R.string.title_template_step, pageNumber + 1, steps.size)
+ frag_steps_title.text = getString(
+ R.string.title_template_step,
+ pageNumber + 1,
+ steps.size
+ )
frag_steps.text = steps[pageNumber]
}
}
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/AlphaFilter.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/AlphaFilter.kt
index 7b5c85f..c24f1c6 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/AlphaFilter.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/AlphaFilter.kt
@@ -1,7 +1,7 @@
/*
* AlphaFilter.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -47,4 +47,4 @@ class AlphaFilter(private val extras: String) : InputFilter {
return sb.toString()
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/MinMaxFilter.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/MinMaxFilter.kt
index 92d25e2..6d9c4ff 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/MinMaxFilter.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/MinMaxFilter.kt
@@ -1,7 +1,7 @@
/*
* MinMaxFilter.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,9 +21,21 @@ import android.text.InputFilter
import android.text.Spanned
import org.jetbrains.anko.AnkoLogger
-class MinMaxFilter(private val min: Int, private val max: Int, private val size: Int, private val zeros: Boolean) : InputFilter, AnkoLogger {
+class MinMaxFilter(
+ private val min: Int,
+ private val max: Int,
+ private val size: Int,
+ private val zeros: Boolean
+) : InputFilter, AnkoLogger {
- override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
+ override fun filter(
+ source: CharSequence,
+ start: Int,
+ end: Int,
+ dest: Spanned,
+ dstart: Int,
+ dend: Int
+ ): CharSequence? {
val input = (dest.toString() + source.toString())
if (isInRange(input, size, min, max, zeros)) {
@@ -56,4 +68,4 @@ class MinMaxFilter(private val min: Int, private val max: Int, private val size:
return false
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/NumberFilter.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/NumberFilter.kt
index afc6a72..cc05db3 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/NumberFilter.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/filters/NumberFilter.kt
@@ -1,7 +1,7 @@
/*
* NumberFilter.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,6 +27,14 @@ class NumberFilter(allowed: String, alt: String) : InputFilter, AnkoLogger {
private val allowed: String
private val digits = "0123456789"
+ init {
+ this.allowed = if (allowed.isDigits()) {
+ "$allowed$alt"
+ } else {
+ "$digits$alt"
+ }
+ }
+
override fun filter(
source: CharSequence,
start: Int,
@@ -52,12 +60,4 @@ class NumberFilter(allowed: String, alt: String) : InputFilter, AnkoLogger {
return sb.toString()
}
}
-
- init {
- this.allowed = if (allowed.isDigits()) {
- "$allowed$alt"
- } else {
- "$digits$alt"
- }
- }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Config.kt b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Config.kt
index bbd1d4a..df78edd 100644
--- a/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Config.kt
+++ b/app/src/main/java/net/thauvin/erik/android/tesremoteprogrammer/models/Config.kt
@@ -1,7 +1,7 @@
/*
* Config.kt
*
- * Copyright 2016-2018 Erik C. Thauvin (erik@thauvin.net)
+ * Copyright 2016-2019 Erik C. Thauvin (erik@thauvin.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,10 @@ import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable
-data class Config(var params: Params, var opts: List