From a835580682e9286be6df55257cf601b9d9d9be53 Mon Sep 17 00:00:00 2001 From: Fabian Zobrist Date: Wed, 21 Dec 2022 20:20:22 +0100 Subject: [PATCH] Target API33. Setup Hilt DI framework. Apply formatting --- app/build.gradle | 34 +- .../tichucounter/ExampleInstrumentedTest.kt | 6 +- app/src/main/AndroidManifest.xml | 13 +- .../me/zobrist/tichucounter/Extensions.kt | 11 - .../java/me/zobrist/tichucounter/History.kt | 65 --- .../java/me/zobrist/tichucounter/Round.kt | 47 -- .../me/zobrist/tichucounter/domain/History.kt | 60 +++ .../tichucounter/domain/IntExtensions.kt | 9 + .../me/zobrist/tichucounter/domain/Round.kt | 37 ++ .../framework/TichuCounterApplication.kt | 9 + .../{ => viewModel}/MainActivity.kt | 446 +++++++----------- app/src/main/res/layout-land/content_main.xml | 8 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/content_main.xml | 8 +- app/src/main/res/menu/menu_main.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- app/src/main/res/xml/locales_config.xml | 4 +- .../zobrist/tichucounter/HistoryUnitTest.kt | 50 +- .../me/zobrist/tichucounter/RoundUnitTest.kt | 58 ++- build.gradle | 4 + 21 files changed, 399 insertions(+), 482 deletions(-) delete mode 100644 app/src/main/java/me/zobrist/tichucounter/Extensions.kt delete mode 100644 app/src/main/java/me/zobrist/tichucounter/History.kt delete mode 100644 app/src/main/java/me/zobrist/tichucounter/Round.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/domain/History.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/domain/IntExtensions.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/domain/Round.kt create mode 100644 app/src/main/java/me/zobrist/tichucounter/framework/TichuCounterApplication.kt rename app/src/main/java/me/zobrist/tichucounter/{ => viewModel}/MainActivity.kt (51%) diff --git a/app/build.gradle b/app/build.gradle index ad1d585..a6325bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,9 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-kapt' + id 'com.google.dagger.hilt.android' +} // Create a variable called keystorePropertiesFile, and initialize it to your // keystore.properties file, in the rootProject folder. @@ -16,15 +20,17 @@ def versionProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) versionProperties.load(new FileInputStream(versionPropertiesFile)) + android { - compileSdkVersion 32 + compileSdkVersion 33 defaultConfig { applicationId "me.zobrist.tichucounter" minSdkVersion 16 - targetSdkVersion 32 + targetSdkVersion 33 versionCode versionProperties["versionCode"].toInteger() versionName "1.1.0Beta1" + resConfigs("de", "en") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -62,17 +68,23 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.8.0' - implementation 'androidx.appcompat:appcompat:1.6.0-alpha05' - implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.appcompat:appcompat:1.6.0-rc01' + implementation 'com.google.android.material:material:1.7.0' implementation 'com.google.android.play:core-ktx:1.8.1' implementation 'com.google.android.play:core-ktx:1.8.1' implementation 'com.google.code.gson:gson:2.8.9' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.2' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.4' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' + implementation "com.google.dagger:hilt-android:2.44" + kapt "com.google.dagger:hilt-compiler:2.44" +} +// Allow references to generated code +kapt { + correctErrorTypes true } \ No newline at end of file diff --git a/app/src/androidTest/java/me/zobrist/tichucounter/ExampleInstrumentedTest.kt b/app/src/androidTest/java/me/zobrist/tichucounter/ExampleInstrumentedTest.kt index 20588ed..ef6f3a2 100644 --- a/app/src/androidTest/java/me/zobrist/tichucounter/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/me/zobrist/tichucounter/ExampleInstrumentedTest.kt @@ -1,13 +1,11 @@ package me.zobrist.tichucounter -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f3aab9..39dcbe2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,19 +2,20 @@ + android:theme="@style/AppTheme"> + android:windowSoftInputMode="adjustPan"> diff --git a/app/src/main/java/me/zobrist/tichucounter/Extensions.kt b/app/src/main/java/me/zobrist/tichucounter/Extensions.kt deleted file mode 100644 index 5f1693f..0000000 --- a/app/src/main/java/me/zobrist/tichucounter/Extensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package me.zobrist.tichucounter - -fun Int.isMultipleOf5(): Boolean -{ - return (this % 5) == 0 -} - -fun Int.isMultipleOf100(): Boolean -{ - return (this % 100) == 0 -} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/History.kt b/app/src/main/java/me/zobrist/tichucounter/History.kt deleted file mode 100644 index f7ddc25..0000000 --- a/app/src/main/java/me/zobrist/tichucounter/History.kt +++ /dev/null @@ -1,65 +0,0 @@ -package me.zobrist.tichucounter - -class History -{ - private var scores=ArrayList() - - fun getScoreA(): Int - { - var tempScore=0 - scores.forEach { - tempScore+=it.scoreA - } - return tempScore - } - - fun getScoreB(): Int - { - var tempScore=0 - scores.forEach { - tempScore+=it.scoreB - } - return tempScore - } - - fun getHistoryA(): String - { - var tempHistory=String() - scores.forEach { - tempHistory+=it.scoreA.toString() + "\n" - } - return tempHistory - } - - fun getHistoryB(): String - { - var tempHistory=String() - scores.forEach { - tempHistory+=it.scoreB.toString() + "\n" - } - return tempHistory - } - - fun logRound(round: Round) - { - scores.add(round) - } - - fun revertLastRound() - { - if (scores.isNotEmpty()) - { - scores.removeAt(scores.size - 1) - } - } - - fun clearAll() - { - scores.clear() - } - - fun isEmpty(): Boolean - { - return scores.isEmpty() - } -} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/Round.kt b/app/src/main/java/me/zobrist/tichucounter/Round.kt deleted file mode 100644 index 93188e3..0000000 --- a/app/src/main/java/me/zobrist/tichucounter/Round.kt +++ /dev/null @@ -1,47 +0,0 @@ -package me.zobrist.tichucounter - -import java.io.Serializable - -class Round() : Serializable -{ - var scoreA: Int=0 - var scoreB: Int=0 - - constructor(score: Int , isScoreA: Boolean) : this() - { - if (isScoreA) - { - scoreA=score - scoreB=calculateOtherScore(scoreA) - } - else - { - scoreB=score - scoreA=calculateOtherScore(scoreB) - } - } - - constructor(scoreA: Int , scoreB: Int) : this() - { - this.scoreA=scoreA - this.scoreB=scoreB - } - - private fun calculateOtherScore(score: Int): Int - { - if (score.isMultipleOf100() && score != 0) - { - return 0 - } - if (score in 101 ..125) - { - return 0 - (score % 100) - } - return 100 - (score % 100) - } - - fun isValidRound(): Boolean - { - return (scoreA.isMultipleOf5()) && scoreB.isMultipleOf5() && (scoreA + scoreB).isMultipleOf100() - } -} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/domain/History.kt b/app/src/main/java/me/zobrist/tichucounter/domain/History.kt new file mode 100644 index 0000000..a3e3c29 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/domain/History.kt @@ -0,0 +1,60 @@ +package me.zobrist.tichucounter.domain + +import javax.inject.Inject + +class History { + private var scores = ArrayList() + + @Inject + constructor() + + fun getScoreA(): Int { + var tempScore = 0 + scores.forEach { + tempScore += it.scoreA + } + return tempScore + } + + fun getScoreB(): Int { + var tempScore = 0 + scores.forEach { + tempScore += it.scoreB + } + return tempScore + } + + fun getHistoryA(): String { + var tempHistory = String() + scores.forEach { + tempHistory += it.scoreA.toString() + "\n" + } + return tempHistory + } + + fun getHistoryB(): String { + var tempHistory = String() + scores.forEach { + tempHistory += it.scoreB.toString() + "\n" + } + return tempHistory + } + + fun logRound(round: Round) { + scores.add(round) + } + + fun revertLastRound() { + if (scores.isNotEmpty()) { + scores.removeAt(scores.size - 1) + } + } + + fun clearAll() { + scores.clear() + } + + fun isEmpty(): Boolean { + return scores.isEmpty() + } +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/domain/IntExtensions.kt b/app/src/main/java/me/zobrist/tichucounter/domain/IntExtensions.kt new file mode 100644 index 0000000..92eff66 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/domain/IntExtensions.kt @@ -0,0 +1,9 @@ +package me.zobrist.tichucounter.domain + +fun Int.isMultipleOf5(): Boolean { + return (this % 5) == 0 +} + +fun Int.isMultipleOf100(): Boolean { + return (this % 100) == 0 +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/domain/Round.kt b/app/src/main/java/me/zobrist/tichucounter/domain/Round.kt new file mode 100644 index 0000000..6ec19b1 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/domain/Round.kt @@ -0,0 +1,37 @@ +package me.zobrist.tichucounter.domain + +import java.io.Serializable + +class Round() : Serializable { + var scoreA: Int = 0 + var scoreB: Int = 0 + + constructor(score: Int, isScoreA: Boolean) : this() { + if (isScoreA) { + scoreA = score + scoreB = calculateOtherScore(scoreA) + } else { + scoreB = score + scoreA = calculateOtherScore(scoreB) + } + } + + constructor(scoreA: Int, scoreB: Int) : this() { + this.scoreA = scoreA + this.scoreB = scoreB + } + + fun calculateOtherScore(score: Int): Int { + if (score.isMultipleOf100() && score != 0) { + return 0 + } + if (score in 101..125) { + return 0 - (score % 100) + } + return 100 - (score % 100) + } + + fun isValidRound(): Boolean { + return (scoreA.isMultipleOf5()) && scoreB.isMultipleOf5() && (scoreA + scoreB).isMultipleOf100() + } +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/framework/TichuCounterApplication.kt b/app/src/main/java/me/zobrist/tichucounter/framework/TichuCounterApplication.kt new file mode 100644 index 0000000..9ebd198 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/framework/TichuCounterApplication.kt @@ -0,0 +1,9 @@ +package me.zobrist.tichucounter.framework + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class TichuCounterApplication : Application() { + +} diff --git a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt b/app/src/main/java/me/zobrist/tichucounter/viewModel/MainActivity.kt similarity index 51% rename from app/src/main/java/me/zobrist/tichucounter/MainActivity.kt rename to app/src/main/java/me/zobrist/tichucounter/viewModel/MainActivity.kt index 21dd10d..8c5549e 100644 --- a/app/src/main/java/me/zobrist/tichucounter/MainActivity.kt +++ b/app/src/main/java/me/zobrist/tichucounter/viewModel/MainActivity.kt @@ -1,4 +1,4 @@ -package me.zobrist.tichucounter +package me.zobrist.tichucounter.viewModel import android.app.AlertDialog import android.content.Intent @@ -14,26 +14,32 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.core.widget.doOnTextChanged import com.google.gson.Gson +import dagger.hilt.android.AndroidEntryPoint +import me.zobrist.tichucounter.R import me.zobrist.tichucounter.databinding.ActivityMainBinding +import me.zobrist.tichucounter.domain.History +import me.zobrist.tichucounter.domain.Round import java.util.* +import javax.inject.Inject -class MainActivity : AppCompatActivity() -{ +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { - private var updateOnChange: Boolean=true + private var updateOnChange: Boolean = true - private lateinit var history: History - private var currentRound=Round() - private var systemLocale=Locale.getDefault() + @Inject + lateinit var history: History + lateinit var currentRound: Round + + private var systemLocale = Locale.getDefault() private lateinit var binding: ActivityMainBinding - override fun onCreate(savedInstanceState: Bundle?) - { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding=ActivityMainBinding.inflate(layoutInflater) + binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar) @@ -42,123 +48,94 @@ class MainActivity : AppCompatActivity() binding.contentMain.inputTeamB.setRawInputType(InputType.TYPE_NULL) binding.contentMain.inputTeamA.requestFocus() disableSubmitButton() - updateTheme(this.getSharedPreferences("Settings" , MODE_PRIVATE).getInt("Theme" , 2)) + updateTheme(this.getSharedPreferences("Settings", MODE_PRIVATE).getInt("Theme", 2)) keepScreenOn( - this.getSharedPreferences("Settings" , MODE_PRIVATE) - .getBoolean("Screen_On" , false) + this.getSharedPreferences("Settings", MODE_PRIVATE) + .getBoolean("Screen_On", false) ) - val json=this.getSharedPreferences("Settings" , MODE_PRIVATE) - .getString("history" , "{\"scores\":[]}") - history=Gson().fromJson(json , History::class.java) + val json = this.getSharedPreferences("Settings", MODE_PRIVATE) + .getString("history", "{\"scores\":[]}") + history = Gson().fromJson(json, History::class.java) binding.contentMain.nameTeamA.setText( - this.getSharedPreferences("Settings" , MODE_PRIVATE).getString("nameTeamA" , "TeamA") + this.getSharedPreferences("Settings", MODE_PRIVATE).getString("nameTeamA", "TeamA") ) binding.contentMain.nameTeamB.setText( - this.getSharedPreferences("Settings" , MODE_PRIVATE).getString("nameTeamB" , "TeamB") + this.getSharedPreferences("Settings", MODE_PRIVATE).getString("nameTeamB", "TeamB") ) updateView() - this.setListenes() + this.setListeners() } - private fun setListenes() - { - binding.contentMain.inputTeamA.setOnFocusChangeListener { _ , b -> - if (b) - { + private fun setListeners() { + binding.contentMain.inputTeamA.setOnFocusChangeListener { _, b -> + if (b) { hideKeyboard() } } - binding.contentMain.inputTeamB.setOnFocusChangeListener { _ , b -> - if (b) - { + binding.contentMain.inputTeamB.setOnFocusChangeListener { _, b -> + if (b) { hideKeyboard() } } - binding.contentMain.inputTeamA.doOnTextChanged { text , _ , _ , _ -> - if (binding.contentMain.inputTeamA.isFocused) - { - if (binding.contentMain.inputTeamA.text.isNotEmpty()) - { - if (updateOnChange) - { - currentRound=try - { - Round(text.toString().toInt() , true) + binding.contentMain.inputTeamA.doOnTextChanged { text, _, _, _ -> + if (binding.contentMain.inputTeamA.isFocused) { + if (binding.contentMain.inputTeamA.text.isNotEmpty()) { + if (updateOnChange) { + currentRound = try { + Round(text.toString().toInt(), true) - } - catch (e: java.lang.Exception) - { - Round(1 , 1) + } catch (e: java.lang.Exception) { + Round(1, 1) } binding.contentMain.inputTeamB.setText(currentRound.scoreB.toString()) + } else { + updateOnChange = true } - else - { - updateOnChange=true - } - } - else - { + } else { binding.contentMain.inputTeamA.text.clear() binding.contentMain.inputTeamB.text.clear() } } - if (currentRound.isValidRound() && binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) - { + if (currentRound.isValidRound() && binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) { enableSubmitButton() - } - else - { + } else { disableSubmitButton() } } - binding.contentMain.inputTeamB.doOnTextChanged { text , _ , _ , _ -> - if (binding.contentMain.inputTeamB.isFocused) - { - if (binding.contentMain.inputTeamB.text.isNotEmpty()) - { - if (updateOnChange) - { - currentRound=try - { - Round(text.toString().toInt() , false) + binding.contentMain.inputTeamB.doOnTextChanged { text, _, _, _ -> + if (binding.contentMain.inputTeamB.isFocused) { + if (binding.contentMain.inputTeamB.text.isNotEmpty()) { + if (updateOnChange) { + currentRound = try { + Round(text.toString().toInt(), false) - } - catch (e: java.lang.Exception) - { - Round(1 , 1) + } catch (e: java.lang.Exception) { + Round(1, 1) } binding.contentMain.inputTeamA.setText(currentRound.scoreA.toString()) - } - else - { - updateOnChange=true + } else { + updateOnChange = true } - } - else - { + } else { binding.contentMain.inputTeamA.text.clear() binding.contentMain.inputTeamB.text.clear() } } - if (currentRound.isValidRound() && binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) - { + if (currentRound.isValidRound() && binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) { enableSubmitButton() - } - else - { + } else { disableSubmitButton() } } @@ -166,37 +143,29 @@ class MainActivity : AppCompatActivity() binding.contentMain.buttonAdd100.setOnClickListener { giveFocusToAIfNone() - if (binding.contentMain.inputTeamA.isFocused) - { + if (binding.contentMain.inputTeamA.isFocused) { - currentRound.scoreA=try - { + currentRound.scoreA = try { binding.contentMain.inputTeamA.text.toString().toInt() + 100 - } - catch (e: Exception) - { - currentRound.scoreB=0 + } catch (e: Exception) { + currentRound.scoreB = 0 binding.contentMain.inputTeamB.setText(currentRound.scoreB.toString()) 100 } - updateOnChange=false + updateOnChange = false binding.contentMain.inputTeamA.setText(currentRound.scoreA.toString()) } - if (binding.contentMain.inputTeamB.isFocused) - { - currentRound.scoreB=try - { + if (binding.contentMain.inputTeamB.isFocused) { + currentRound.scoreB = try { binding.contentMain.inputTeamB.text.toString().toInt() + 100 - } - catch (e: Exception) - { - currentRound.scoreA=0 + } catch (e: Exception) { + currentRound.scoreA = 0 binding.contentMain.inputTeamA.setText(currentRound.scoreA.toString()) 100 } - updateOnChange=false + updateOnChange = false binding.contentMain.inputTeamB.setText(currentRound.scoreB.toString()) } @@ -205,35 +174,27 @@ class MainActivity : AppCompatActivity() binding.contentMain.buttonSub100.setOnClickListener { giveFocusToAIfNone() - if (binding.contentMain.inputTeamA.isFocused) - { - currentRound.scoreA=try - { + if (binding.contentMain.inputTeamA.isFocused) { + currentRound.scoreA = try { binding.contentMain.inputTeamA.text.toString().toInt() - 100 - } - catch (e: Exception) - { - currentRound.scoreB=0 + } catch (e: Exception) { + currentRound.scoreB = 0 binding.contentMain.inputTeamB.setText(currentRound.scoreB.toString()) -100 } - updateOnChange=false + updateOnChange = false binding.contentMain.inputTeamA.setText(currentRound.scoreA.toString()) } - if (binding.contentMain.inputTeamB.isFocused) - { - currentRound.scoreB=try - { + if (binding.contentMain.inputTeamB.isFocused) { + currentRound.scoreB = try { binding.contentMain.inputTeamB.text.toString().toInt() - 100 - } - catch (e: Exception) - { - currentRound.scoreA=0 + } catch (e: Exception) { + currentRound.scoreA = 0 binding.contentMain.inputTeamA.setText(currentRound.scoreA.toString()) -100 } - updateOnChange=false + updateOnChange = false binding.contentMain.inputTeamB.setText(currentRound.scoreB.toString()) } } @@ -293,42 +254,29 @@ class MainActivity : AppCompatActivity() giveFocusToAIfNone() - if (binding.contentMain.inputTeamA.isFocused) - { - if (binding.contentMain.inputTeamA.text.toString().equals("-")) - { + if (binding.contentMain.inputTeamA.isFocused) { + if (binding.contentMain.inputTeamA.text.toString() == "-") { binding.contentMain.inputTeamA.text.clear() - } - else if (binding.contentMain.inputTeamA.text.isNotEmpty()) - { - tempInt=binding.contentMain.inputTeamA.text.toString().toInt() * -1 + } else if (binding.contentMain.inputTeamA.text.isNotEmpty()) { + tempInt = binding.contentMain.inputTeamA.text.toString().toInt() * -1 binding.contentMain.inputTeamA.setText(tempInt.toString()) - } - else - { - updateOnChange=false + } else { + updateOnChange = false appendToFocusedInput('-') - currentRound=Round(1 , 1) + currentRound = Round(1, 1) } - } - else if (binding.contentMain.inputTeamB.isFocused) - { - if (binding.contentMain.inputTeamB.text.toString().equals("-")) - { + } else if (binding.contentMain.inputTeamB.isFocused) { + if (binding.contentMain.inputTeamB.text.toString() == "-") { binding.contentMain.inputTeamB.text.clear() - } - else if (binding.contentMain.inputTeamB.text.isNotEmpty()) - { - tempInt=binding.contentMain.inputTeamB.text.toString().toInt() * -1 + } else if (binding.contentMain.inputTeamB.text.isNotEmpty()) { + tempInt = binding.contentMain.inputTeamB.text.toString().toInt() * -1 binding.contentMain.inputTeamB.setText(tempInt.toString()) - } - else - { - updateOnChange=false + } else { + updateOnChange = false appendToFocusedInput('-') - currentRound=Round(1 , 1) + currentRound = Round(1, 1) } } } @@ -336,21 +284,16 @@ class MainActivity : AppCompatActivity() binding.contentMain.buttonBack.setOnClickListener { giveFocusToAIfNone() - if (binding.contentMain.inputTeamA.isFocused) - { - if (binding.contentMain.inputTeamA.text.isNotEmpty()) - { - val string=binding.contentMain.inputTeamA.text.toString() - binding.contentMain.inputTeamA.setText(string.substring(0 , string.length - 1)) + if (binding.contentMain.inputTeamA.isFocused) { + if (binding.contentMain.inputTeamA.text.isNotEmpty()) { + val string = binding.contentMain.inputTeamA.text.toString() + binding.contentMain.inputTeamA.setText(string.substring(0, string.length - 1)) } - } - else if (binding.contentMain.inputTeamB.isFocused) - { - if (binding.contentMain.inputTeamB.text.isNotEmpty()) - { - val string=binding.contentMain.inputTeamB.text.toString() - binding.contentMain.inputTeamB.setText(string.substring(0 , string.length - 1)) + } else if (binding.contentMain.inputTeamB.isFocused) { + if (binding.contentMain.inputTeamB.text.isNotEmpty()) { + val string = binding.contentMain.inputTeamB.text.toString() + binding.contentMain.inputTeamB.setText(string.substring(0, string.length - 1)) } } } @@ -358,12 +301,11 @@ class MainActivity : AppCompatActivity() binding.contentMain.submit.setOnClickListener { giveFocusToAIfNone() - if (binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) - { + if (binding.contentMain.inputTeamA.text.isNotEmpty() && binding.contentMain.inputTeamB.text.isNotEmpty()) { history.logRound( Round( - binding.contentMain.inputTeamA.text.toString().toInt() , + binding.contentMain.inputTeamA.text.toString().toInt(), binding.contentMain.inputTeamB.text.toString().toInt() ) ) @@ -379,69 +321,60 @@ class MainActivity : AppCompatActivity() } } - override fun onSaveInstanceState(outState: Bundle) - { + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - val prefs=this.getSharedPreferences("Settings" , MODE_PRIVATE).edit() - prefs.putString("history" , Gson().toJson(history)) - prefs.putString("nameTeamA" , binding.contentMain.nameTeamA.text.toString()) - prefs.putString("nameTeamB" , binding.contentMain.nameTeamB.text.toString()) + val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit() + prefs.putString("history", Gson().toJson(history)) + prefs.putString("nameTeamA", binding.contentMain.nameTeamA.text.toString()) + prefs.putString("nameTeamB", binding.contentMain.nameTeamB.text.toString()) prefs.apply() } - override fun onCreateOptionsMenu(menu: Menu): Boolean - { + override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. - menuInflater.inflate(R.menu.menu_main , menu) + menuInflater.inflate(R.menu.menu_main, menu) - menu.findItem(R.id.action_screenOn).isChecked= - this.getSharedPreferences("Settings" , MODE_PRIVATE) - .getBoolean("Screen_On" , false) + menu.findItem(R.id.action_screenOn).isChecked = + this.getSharedPreferences("Settings", MODE_PRIVATE) + .getBoolean("Screen_On", false) return true } - override fun onOptionsItemSelected(item: MenuItem): Boolean - { - return when (item.itemId) - { - R.id.action_clear -> - { - val builder=AlertDialog.Builder(this) + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_clear -> { + val builder = AlertDialog.Builder(this) builder.setMessage(getString(R.string.confirmClear)) .setTitle(R.string.clear) .setCancelable(false) - .setPositiveButton(getString(R.string.yes)) { dialog , _ -> + .setPositiveButton(getString(R.string.yes)) { dialog, _ -> dialog.dismiss() clearAll() } - .setNegativeButton(getString(R.string.no)) { dialog , _ -> + .setNegativeButton(getString(R.string.no)) { dialog, _ -> dialog.cancel() } builder.create().show() true } - R.id.action_undo -> - { + R.id.action_undo -> { undoLastRound() true } - R.id.action_theme -> - { + R.id.action_theme -> { chooseThemeDialog() true } - R.id.action_language -> - { + R.id.action_language -> { chooseLanguageDialog() true } - R.id.action_screenOn -> - { - item.isChecked=!item.isChecked + R.id.action_screenOn -> { + item.isChecked = !item.isChecked keepScreenOn(item.isChecked) true } @@ -449,92 +382,79 @@ class MainActivity : AppCompatActivity() } } - private fun hideKeyboard() - { - val imm: InputMethodManager= + private fun hideKeyboard() { + val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(currentFocus!!.windowToken , 0) + imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0) } - private fun giveFocusToAIfNone() - { - if (!binding.contentMain.inputTeamA.isFocused && !binding.contentMain.inputTeamB.isFocused) - { + private fun giveFocusToAIfNone() { + if (!binding.contentMain.inputTeamA.isFocused && !binding.contentMain.inputTeamB.isFocused) { binding.contentMain.inputTeamA.requestFocus() } } - private fun undoLastRound() - { + private fun undoLastRound() { history.revertLastRound() updateView() } - private fun updateView() - { - binding.contentMain.scoreA.text=history.getScoreA().toString() - binding.contentMain.scoreB.text=history.getScoreB().toString() + private fun updateView() { + binding.contentMain.scoreA.text = history.getScoreA().toString() + binding.contentMain.scoreB.text = history.getScoreB().toString() - binding.contentMain.historyA.text=history.getHistoryA() - binding.contentMain.historyB.text=history.getHistoryB() + binding.contentMain.historyA.text = history.getHistoryA() + binding.contentMain.historyB.text = history.getHistoryB() } - private fun clearAll() - { - binding.contentMain.historyA.text="" - binding.contentMain.historyB.text="" + private fun clearAll() { + binding.contentMain.historyA.text = "" + binding.contentMain.historyB.text = "" binding.contentMain.inputTeamA.text.clear() binding.contentMain.inputTeamB.text.clear() - binding.contentMain.scoreA.text="0" - binding.contentMain.scoreB.text="0" + binding.contentMain.scoreA.text = "0" + binding.contentMain.scoreB.text = "0" history.clearAll() } - private fun appendToFocusedInput(toAppend: Char) - { - if (binding.contentMain.inputTeamA.isFocused) - { + private fun appendToFocusedInput(toAppend: Char) { + if (binding.contentMain.inputTeamA.isFocused) { binding.contentMain.inputTeamA.text.append(toAppend) - } - else if (binding.contentMain.inputTeamB.isFocused) - { + } else if (binding.contentMain.inputTeamB.isFocused) { binding.contentMain.inputTeamB.text.append(toAppend) } } - private fun enableSubmitButton() - { - binding.contentMain.submit.imageAlpha=255 // 0 being transparent and 255 being opaque - binding.contentMain.submit.isEnabled=true + private fun enableSubmitButton() { + binding.contentMain.submit.imageAlpha = 255 // 0 being transparent and 255 being opaque + binding.contentMain.submit.isEnabled = true } - private fun disableSubmitButton() - { - binding.contentMain.submit.imageAlpha=60 // 0 being transparent and 255 being opaque - binding.contentMain.submit.isEnabled=false + private fun disableSubmitButton() { + binding.contentMain.submit.imageAlpha = 60 // 0 being transparent and 255 being opaque + binding.contentMain.submit.isEnabled = false } - private fun chooseThemeDialog() - { + private fun chooseThemeDialog() { - val builder=AlertDialog.Builder(this) + val builder = AlertDialog.Builder(this) builder.setTitle(getString(R.string.choose_theme_text)) - val styles=arrayOf( - getString(R.string.light) , - getString(R.string.dark) , + val styles = arrayOf( + getString(R.string.light), + getString(R.string.dark), getString(R.string.android_default_text) ) - val checkedItem= - this.getSharedPreferences("Settings" , MODE_PRIVATE).getInt("Theme" , 2) + val checkedItem = + this.getSharedPreferences("Settings", MODE_PRIVATE).getInt("Theme", 2) - val prefs=this.getSharedPreferences("Settings" , MODE_PRIVATE).edit() + val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit() - builder.setSingleChoiceItems(styles , checkedItem) { dialog , which -> + builder.setSingleChoiceItems(styles, checkedItem) { dialog, which -> - prefs.putInt("Theme" , which) + prefs.putInt("Theme", which) prefs.apply() updateTheme(which) @@ -542,53 +462,49 @@ class MainActivity : AppCompatActivity() dialog.dismiss() } - val dialog=builder.create() + val dialog = builder.create() dialog.show() } - private fun chooseLanguageDialog() - { + private fun chooseLanguageDialog() { - val builder=AlertDialog.Builder(this) + val builder = AlertDialog.Builder(this) builder.setTitle(getString(R.string.choose_language_text)) - val languages_map=mapOf( - getString(R.string.english) to "en" , + val languagesMap = mapOf( + getString(R.string.english) to "en", getString(R.string.german) to "de" ) - val languages_display_keys=languages_map.keys.toTypedArray() - val languages_display_values=languages_map.values.toTypedArray() + val languagesDisplayKeys = languagesMap.keys.toTypedArray() + val languagesDisplayValues = languagesMap.values.toTypedArray() - val checkedItem=AppCompatDelegate.getApplicationLocales()[0].toString() - var checkedItemIndex=languages_display_values.indexOf(checkedItem) + val checkedItem = AppCompatDelegate.getApplicationLocales()[0].toString() + var checkedItemIndex = languagesDisplayValues.indexOf(checkedItem) - if (checkedItemIndex == -1) - { - checkedItemIndex=0 + if (checkedItemIndex == -1) { + checkedItemIndex = 0 } - builder.setSingleChoiceItems(languages_display_keys , checkedItemIndex) { dialog , which -> + builder.setSingleChoiceItems(languagesDisplayKeys, checkedItemIndex) { dialog, which -> - val newLocale= - LocaleListCompat.forLanguageTags(languages_map[languages_display_keys[which]]) + val newLocale = + LocaleListCompat.forLanguageTags(languagesMap[languagesDisplayKeys[which]]) AppCompatDelegate.setApplicationLocales(newLocale) - startActivity(Intent(this , MainActivity::class.java)) + startActivity(Intent(this, MainActivity::class.java)) finish() dialog.dismiss() } - val dialog=builder.create() + val dialog = builder.create() dialog.show() } - private fun updateTheme(which: Int) - { - when (which) - { + private fun updateTheme(which: Int) { + when (which) { 0 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) 1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) 2 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) @@ -596,19 +512,15 @@ class MainActivity : AppCompatActivity() delegate.applyDayNight() } - private fun keepScreenOn(keepOn: Boolean) - { - if (keepOn) - { + private fun keepScreenOn(keepOn: Boolean) { + if (keepOn) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } - else - { + } else { window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } - val prefs=this.getSharedPreferences("Settings" , MODE_PRIVATE).edit() - prefs.putBoolean("Screen_On" , keepOn) + val prefs = this.getSharedPreferences("Settings", MODE_PRIVATE).edit() + prefs.putBoolean("Screen_On", keepOn) prefs.apply() } } \ No newline at end of file diff --git a/app/src/main/res/layout-land/content_main.xml b/app/src/main/res/layout-land/content_main.xml index a205dec..f75351b 100644 --- a/app/src/main/res/layout-land/content_main.xml +++ b/app/src/main/res/layout-land/content_main.xml @@ -269,12 +269,12 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:contentDescription="TODO" android:cropToPadding="false" android:paddingTop="15dp" android:paddingBottom="15dp" android:scaleType="fitCenter" - app:srcCompat="@drawable/back" - android:contentDescription="TODO" /> + app:srcCompat="@drawable/back" /> @@ -312,9 +312,9 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1.0" + android:contentDescription="TODO" android:scaleType="fitCenter" - app:srcCompat="@drawable/checkmark" - android:contentDescription="TODO" /> + app:srcCompat="@drawable/checkmark" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4c98b99..72de909 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".viewModel.MainActivity"> + app:srcCompat="@drawable/back" /> @@ -331,8 +331,8 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1.0" + android:contentDescription="TODO" android:scaleType="fitCenter" - app:srcCompat="@drawable/checkmark" - android:contentDescription="TODO" /> + app:srcCompat="@drawable/checkmark" /> \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index e534389..a4fa791 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,7 +1,7 @@ + tools:context="me.zobrist.tichucounter.viewModel.MainActivity"> - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09b..c9ad5f9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index e04caba..cb544e7 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -1,5 +1,5 @@ - - + + diff --git a/app/src/test/java/me/zobrist/tichucounter/HistoryUnitTest.kt b/app/src/test/java/me/zobrist/tichucounter/HistoryUnitTest.kt index 65ea151..448faac 100644 --- a/app/src/test/java/me/zobrist/tichucounter/HistoryUnitTest.kt +++ b/app/src/test/java/me/zobrist/tichucounter/HistoryUnitTest.kt @@ -1,5 +1,7 @@ package me.zobrist.tichucounter +import me.zobrist.tichucounter.domain.History +import me.zobrist.tichucounter.domain.Round import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Test @@ -9,12 +11,10 @@ import org.junit.Test * * See [testing documentation](http://d.android.com/tools/testing). */ -class HistoryUnitTest -{ +class HistoryUnitTest { @Test - fun calculation_isCorrect() - { - val history=History() + fun calculation_isCorrect() { + val history = History() history.revertLastRound() history.getHistoryA() @@ -22,34 +22,34 @@ class HistoryUnitTest history.getScoreA() history.getScoreB() - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) - history.logRound(Round(10 , 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) + history.logRound(Round(10, 10)) - assertEquals(100 , history.getScoreA()) - assertEquals(100 , history.getScoreB()) + assertEquals(100, history.getScoreA()) + assertEquals(100, history.getScoreB()) history.revertLastRound() - assertEquals(90 , history.getScoreA()) - assertEquals(90 , history.getScoreB()) + assertEquals(90, history.getScoreA()) + assertEquals(90, history.getScoreB()) - assertNotEquals("" , history.getHistoryA()) - assertNotEquals("" , history.getHistoryB()) + assertNotEquals("", history.getHistoryA()) + assertNotEquals("", history.getHistoryB()) history.clearAll() - assertEquals(0 , history.getScoreA()) - assertEquals(0 , history.getScoreB()) + assertEquals(0, history.getScoreA()) + assertEquals(0, history.getScoreB()) - assertEquals("" , history.getHistoryA()) - assertEquals("" , history.getHistoryB()) + assertEquals("", history.getHistoryA()) + assertEquals("", history.getHistoryB()) } } \ No newline at end of file diff --git a/app/src/test/java/me/zobrist/tichucounter/RoundUnitTest.kt b/app/src/test/java/me/zobrist/tichucounter/RoundUnitTest.kt index ba0c920..37984b4 100644 --- a/app/src/test/java/me/zobrist/tichucounter/RoundUnitTest.kt +++ b/app/src/test/java/me/zobrist/tichucounter/RoundUnitTest.kt @@ -1,5 +1,6 @@ package me.zobrist.tichucounter +import me.zobrist.tichucounter.domain.Round import org.junit.Assert.* import org.junit.Test @@ -8,70 +9,67 @@ import org.junit.Test * * See [testing documentation](http://d.android.com/tools/testing). */ -class RoundUnitTest -{ +class RoundUnitTest { @Test - fun calculation_isCorrect() - { + fun calculation_isCorrect() { - var inputScoreA=125 - var inputScoreB=-25 + var inputScoreA = 125 + var inputScoreB = -25 var temp: Round // Normal round range -25 to 125 as input - while (inputScoreB <= 125) - { - temp=Round(inputScoreA , true) - assertEquals(inputScoreB , temp.scoreB) + while (inputScoreB <= 125) { + temp = Round(inputScoreA, true) + assertEquals(inputScoreB, temp.scoreB) assertTrue(temp.isValidRound()) - temp=Round(inputScoreA , false) - assertEquals(inputScoreB , temp.scoreA) + temp = Round(inputScoreA, false) + assertEquals(inputScoreB, temp.scoreA) assertTrue(temp.isValidRound()) - inputScoreA-=5 - inputScoreB+=5 + inputScoreA -= 5 + inputScoreB += 5 } // Double win - temp=Round(200 , true) - assertEquals(0 , temp.scoreB) + temp = Round(200, true) + assertEquals(0, temp.scoreB) assertTrue(temp.isValidRound()) - temp=Round(200 , false) - assertEquals(0 , temp.scoreA) + temp = Round(200, false) + assertEquals(0, temp.scoreA) assertTrue(temp.isValidRound()) // Double win with Tichu - temp=Round(300 , true) - assertEquals(0 , temp.scoreB) + temp = Round(300, true) + assertEquals(0, temp.scoreB) assertTrue(temp.isValidRound()) - temp=Round(300 , false) - assertEquals(0 , temp.scoreA) + temp = Round(300, false) + assertEquals(0, temp.scoreA) assertTrue(temp.isValidRound()) // Double win with Grand Tichu - temp=Round(400 , true) - assertEquals(0 , temp.scoreB) + temp = Round(400, true) + assertEquals(0, temp.scoreB) assertTrue(temp.isValidRound()) - temp=Round(400 , false) - assertEquals(0 , temp.scoreA) + temp = Round(400, false) + assertEquals(0, temp.scoreA) assertTrue(temp.isValidRound()) //Good rounds - temp=Round(0 , 0) + temp = Round(0, 0) assertTrue(temp.isValidRound()) //Bad rounds - temp=Round(5 , 12) + temp = Round(5, 12) assertFalse(temp.isValidRound()) - temp=Round(12 , 5) + temp = Round(12, 5) assertFalse(temp.isValidRound()) - temp=Round(5 , 55) + temp = Round(5, 55) assertFalse(temp.isValidRound()) } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index f970681..4a228c2 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,10 @@ buildscript { } } +plugins { + id 'com.google.dagger.hilt.android' version '2.44' apply false +} + allprojects { repositories { google()