From c122e0392a01a6dba7da25224e0c7bcca8c318d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blik?= Date: Sun, 14 Jun 2026 07:23:17 +0200 Subject: [PATCH] docs: complete 100% kdoc coverage and update app branding --- .../com/example/retroha/AutomatedClickTest.kt | 29 ----------- .../retroha/ExampleInstrumentedTest.kt | 14 ----- .../com/example/retroha/MonkeyStressTest.kt | 1 + .../java/com/example/retroha/BaseActivity.kt | 5 ++ .../retroha/ConnectionSettingsActivity.kt | 33 ++++++++---- .../retroha/EntitySelectionActivity.kt | 24 ++++++--- .../example/retroha/InstructionsActivity.kt | 3 ++ .../com/example/retroha/LanguageActivity.kt | 10 +++- .../java/com/example/retroha/MainActivity.kt | 51 +++++++++++++----- .../com/example/retroha/SettingsActivity.kt | 19 ++++--- .../java/com/example/retroha/data/Prefs.kt | 21 ++++++++ .../example/retroha/i18n/AndroidStrings.kt | 10 +++- .../com/example/retroha/i18n/LocaleHelper.kt | 13 +++++ .../example/retroha/network/HaApiService.kt | 25 +++++++++ .../com/example/retroha/network/HaClient.kt | 16 ++++++ .../example/retroha/network/HaStateAdapter.kt | 9 ++++ .../com/example/retroha/ui/BauhausCheckbox.kt | 9 ++++ .../retroha/ui/EntitySelectionAdapter.kt | 7 +++ .../main/java/com/example/retroha/ui/Fonts.kt | 7 +++ .../java/com/example/retroha/ui/HaIcons.kt | 16 ++++++ .../retroha/ui/LanguageIconDrawable.kt | 7 +++ .../example/retroha/ui/LightControlDialog.kt | 10 ++++ .../com/example/retroha/ui/WidgetAdapter.kt | 15 ++++++ .../com/example/retroha/ui/WidgetCardView.kt | 14 +++++ app/src/main/res/values-en/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- .../com/example/retroha/i18n/StringKey.kt | 52 +++++++++++++++++++ .../com/example/retroha/i18n/Strings.kt | 10 ++++ .../com/example/retroha/model/EntityState.kt | 16 +++++- .../com/example/retroha/model/WidgetConfig.kt | 14 +++++ .../retroha/model/WidgetInteraction.kt | 19 ++++++- .../com/example/retroha/theme/Colors.kt | 37 +++++++++++++ 32 files changed, 435 insertions(+), 89 deletions(-) delete mode 100644 app/src/androidTest/java/com/example/retroha/AutomatedClickTest.kt delete mode 100644 app/src/androidTest/java/com/example/retroha/ExampleInstrumentedTest.kt diff --git a/app/src/androidTest/java/com/example/retroha/AutomatedClickTest.kt b/app/src/androidTest/java/com/example/retroha/AutomatedClickTest.kt deleted file mode 100644 index 69f3517..0000000 --- a/app/src/androidTest/java/com/example/retroha/AutomatedClickTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.retroha -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.ext.junit.rules.ActivityScenarioRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -@RunWith(AndroidJUnit4::class) -class AutomatedClickTest { - @get:Rule - val activityRule = ActivityScenarioRule(MainActivity::class.java) - @Test - fun clickThroughAllTabs() { - Thread.sleep(1000) - val tabResIds = listOf( - R.string.tab_lighting, - R.string.tab_sockets, - R.string.tab_power, - R.string.tab_weather, - R.string.tab_all - ) - tabResIds.forEach { resId -> - onView(withText(resId)).perform(click()) - Thread.sleep(500) - } - } -} diff --git a/app/src/androidTest/java/com/example/retroha/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/retroha/ExampleInstrumentedTest.kt deleted file mode 100644 index f8c5e9c..0000000 --- a/app/src/androidTest/java/com/example/retroha/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.retroha -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.Assert.* -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.example.retroha", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/retroha/MonkeyStressTest.kt b/app/src/androidTest/java/com/example/retroha/MonkeyStressTest.kt index cdd5e4e..fb56aba 100644 --- a/app/src/androidTest/java/com/example/retroha/MonkeyStressTest.kt +++ b/app/src/androidTest/java/com/example/retroha/MonkeyStressTest.kt @@ -18,6 +18,7 @@ import android.view.ViewGroup import android.widget.GridView import org.hamcrest.Description import org.hamcrest.TypeSafeMatcher +import com.example.retroha.R @RunWith(AndroidJUnit4::class) class MonkeyStressTest { @get:Rule diff --git a/app/src/main/java/com/example/retroha/BaseActivity.kt b/app/src/main/java/com/example/retroha/BaseActivity.kt index e8cff8e..5e421cc 100644 --- a/app/src/main/java/com/example/retroha/BaseActivity.kt +++ b/app/src/main/java/com/example/retroha/BaseActivity.kt @@ -4,6 +4,11 @@ import android.content.Context import android.os.Bundle import com.example.retroha.i18n.LocaleHelper +/** + * Base activity class that provides automatic localization support. + * All activities in the application should extend this class to ensure + * dynamic language changes are applied correctly. + */ abstract class BaseActivity : Activity() { override fun attachBaseContext(newBase: Context) { super.attachBaseContext(LocaleHelper.setLocale(newBase)) diff --git a/app/src/main/java/com/example/retroha/ConnectionSettingsActivity.kt b/app/src/main/java/com/example/retroha/ConnectionSettingsActivity.kt index 89affad..bf24361 100644 --- a/app/src/main/java/com/example/retroha/ConnectionSettingsActivity.kt +++ b/app/src/main/java/com/example/retroha/ConnectionSettingsActivity.kt @@ -3,11 +3,18 @@ import android.app.Activity import android.os.Bundle import android.widget.* import com.example.retroha.data.Prefs +import com.example.retroha.i18n.AndroidStrings +import com.example.retroha.i18n.StringKey import com.example.retroha.network.HaClient import com.example.retroha.network.HaState import retrofit2.Call import retrofit2.Callback import retrofit2.Response +/** + * Activity for configuring the connection to the Home Assistant server. + * Handles server URL, authentication token, and refresh interval settings. + * Includes a validation step before saving. + */ class ConnectionSettingsActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -24,20 +31,24 @@ class ConnectionSettingsActivity : BaseActivity() { val url = etUrl.text.toString() val token = etToken.text.toString() val intervalSec = etRefreshInterval.text.toString().toLongOrNull() ?: 30L - val strings = com.example.retroha.i18n.AndroidStrings(this) + val stringsProvider = AndroidStrings(this) android.app.AlertDialog.Builder(this) - .setTitle(strings.get(com.example.retroha.i18n.StringKey.DIALOG_WARNING)) - .setMessage(strings.get(com.example.retroha.i18n.StringKey.CONFIRM_CHANGE_CONN)) - .setPositiveButton(strings.get(com.example.retroha.i18n.StringKey.DIALOG_YES_CHANGE)) { _, _ -> + .setTitle(stringsProvider.get(StringKey.DIALOG_WARNING)) + .setMessage(stringsProvider.get(StringKey.CONFIRM_CHANGE_CONN)) + .setPositiveButton(stringsProvider.get(StringKey.DIALOG_YES_CHANGE)) { _, _ -> performTestAndSave(url, token, intervalSec, tvStatus) } - .setNegativeButton(strings.get(com.example.retroha.i18n.StringKey.DIALOG_CANCEL), null) + .setNegativeButton(stringsProvider.get(StringKey.DIALOG_CANCEL), null) .show() } } + /** + * Attempts to connect to HA with the provided credentials. + * If successful, saves the configuration and clears the widget cache. + */ private fun performTestAndSave(url: String, token: String, intervalSec: Long, tvStatus: TextView) { - val strings = com.example.retroha.i18n.AndroidStrings(this) - tvStatus.text = strings.get(com.example.retroha.i18n.StringKey.STATUS_CONNECTING) + val stringsProvider = AndroidStrings(this) + tvStatus.text = stringsProvider.get(StringKey.STATUS_CONNECTING) tvStatus.setTextColor(0xFF000000.toInt()) val testClient = HaClient.getServiceForTest(url, token) testClient.getStates().enqueue(object : Callback> { @@ -49,21 +60,21 @@ class ConnectionSettingsActivity : BaseActivity() { Prefs.setSelectedEntities(this@ConnectionSettingsActivity, emptySet()) HaClient.clearCache() runOnUiThread { - tvStatus.text = strings.get(StringKey.STATUS_SUCCESS) + tvStatus.text = stringsProvider.get(StringKey.STATUS_SUCCESS) tvStatus.setTextColor(0xFF0056B3.toInt()) - Toast.makeText(this@ConnectionSettingsActivity, strings.get(StringKey.TOAST_SAVED_CLEARED), Toast.LENGTH_SHORT).show() + Toast.makeText(this@ConnectionSettingsActivity, stringsProvider.get(StringKey.TOAST_SAVED_CLEARED), Toast.LENGTH_SHORT).show() finish() } } else { runOnUiThread { - tvStatus.text = "${strings.get(StringKey.STATUS_ERROR)}: ${response.code()}" + tvStatus.text = "${stringsProvider.get(StringKey.STATUS_ERROR)}: ${response.code()}" tvStatus.setTextColor(0xFFE23A24.toInt()) } } } override fun onFailure(call: Call>, t: Throwable) { runOnUiThread { - tvStatus.text = "${strings.get(StringKey.STATUS_ERROR_NETWORK)}: ${t.message}" + tvStatus.text = "${stringsProvider.get(StringKey.STATUS_ERROR_NETWORK)}: ${t.message}" tvStatus.setTextColor(0xFFE23A24.toInt()) } } diff --git a/app/src/main/java/com/example/retroha/EntitySelectionActivity.kt b/app/src/main/java/com/example/retroha/EntitySelectionActivity.kt index ab1aa2d..e6b7549 100644 --- a/app/src/main/java/com/example/retroha/EntitySelectionActivity.kt +++ b/app/src/main/java/com/example/retroha/EntitySelectionActivity.kt @@ -4,12 +4,18 @@ import android.text.Editable import android.text.TextWatcher import android.widget.* import com.example.retroha.data.Prefs +import com.example.retroha.i18n.AndroidStrings +import com.example.retroha.i18n.StringKey import com.example.retroha.network.HaClient import com.example.retroha.network.HaState import com.example.retroha.ui.EntitySelectionAdapter import retrofit2.Call import retrofit2.Callback import retrofit2.Response +/** + * Activity for browsing and selecting Home Assistant entities to be displayed as widgets. + * Features real-time filtering and persistent selection storage. + */ class EntitySelectionActivity : BaseActivity() { private lateinit var etSearch: EditText private lateinit var lvEntities: ListView @@ -20,14 +26,14 @@ class EntitySelectionActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_entity_selection) - val strings = com.example.retroha.i18n.AndroidStrings(this) + val stringsProvider = AndroidStrings(this) etSearch = findViewById(R.id.etSearch) lvEntities = findViewById(R.id.lvEntities) val btnSave = findViewById