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