diff --git a/app/src/main/java/net/helcel/beans/activity/MainActivity.kt b/app/src/main/java/net/helcel/beans/activity/MainActivity.kt index 9f0eba7..beed2b0 100644 --- a/app/src/main/java/net/helcel/beans/activity/MainActivity.kt +++ b/app/src/main/java/net/helcel/beans/activity/MainActivity.kt @@ -1,7 +1,6 @@ package net.helcel.beans.activity import android.content.Intent -import android.content.SharedPreferences import android.graphics.drawable.PictureDrawable import android.os.Bundle import android.view.Menu @@ -22,8 +21,6 @@ import net.helcel.beans.svg.SVGWrapper class MainActivity : AppCompatActivity() { - private lateinit var sharedPreferences: SharedPreferences - private lateinit var photoView: PhotoView private lateinit var psvg: SVGWrapper @@ -40,7 +37,7 @@ class MainActivity : AppCompatActivity() { // Create action bar supportActionBar?.setBackgroundDrawable(colorWrapper(this, android.R.attr.colorPrimary)) - // Fetch shared preferences to restore app theme upon startup + // restore app theme & settings upon startup Settings.start(this) // Create menu in action bar @@ -81,7 +78,7 @@ class MainActivity : AppCompatActivity() { photoView.minimumScale = 1f photoView.maximumScale = 40f - GeoLocImporter.importState(this) + GeoLocImporter.importStates(this) loadData(this, Int.MIN_VALUE) psvg = SVGWrapper(this) css = CSSWrapper(this) diff --git a/app/src/main/java/net/helcel/beans/activity/adapter/GeolocListAdapter.kt b/app/src/main/java/net/helcel/beans/activity/adapter/GeolocListAdapter.kt index e8445da..717b0f4 100644 --- a/app/src/main/java/net/helcel/beans/activity/adapter/GeolocListAdapter.kt +++ b/app/src/main/java/net/helcel/beans/activity/adapter/GeolocListAdapter.kt @@ -15,11 +15,7 @@ import net.helcel.beans.R import net.helcel.beans.activity.fragment.EditPlaceColorFragment import net.helcel.beans.activity.fragment.EditPlaceFragment import net.helcel.beans.countries.GeoLoc -import net.helcel.beans.helper.Data.groups -import net.helcel.beans.helper.Data.saveData -import net.helcel.beans.helper.Data.selected_geoloc -import net.helcel.beans.helper.Data.selected_group -import net.helcel.beans.helper.Data.visits +import net.helcel.beans.helper.Data import net.helcel.beans.helper.Settings import net.helcel.beans.helper.Theme.colorWrapper @@ -64,16 +60,10 @@ class GeolocListAdapter( fun bind(el: GeoLoc) { textView.text = el.fullName - if (el.children.isEmpty() || (el.type == GeoLoc.LocType.COUNTRY && !Settings.isRegional( - ctx - )) - ) { - textView.backgroundTintList = - ColorStateList.valueOf(colorWrapper(ctx, android.R.attr.colorBackground).color) - } else { + if (el.shouldShowChildren(ctx)) { textView.setTypeface(null, Typeface.BOLD) - val numerator = el.children.map { visits.getVisited(it) != 0 }.count { it } + val numerator = el.children.map { Data.visits.getVisited(it) != 0 }.count { it } val denominator = el.children.size progressView.text = when (statsPref) { @@ -91,31 +81,31 @@ class GeolocListAdapter( ).color ).withAlpha(128) textView.parent.parent.requestChildFocus(textView, textView) + } else { + textView.backgroundTintList = + ColorStateList.valueOf(colorWrapper(ctx, android.R.attr.colorBackground).color) } refreshCheck(el) } fun addListeners(el: GeoLoc, expandLambda: () -> Boolean) { - if (el.children.isNotEmpty() && (el.type != GeoLoc.LocType.COUNTRY || Settings.isRegional( - ctx - )) - ) { + if (el.shouldShowChildren(ctx)) { textView.setOnClickListener { expandLambda() } } checkBox.setOnClickListener { - selected_geoloc = el - if (groups.size() == 1 && Settings.isSingleGroup(ctx)) { + Data.selected_geoloc = el + if (Data.groups.size() == 1 && Settings.isSingleGroup(ctx)) { if (checkBox.isChecked) { // If one has just checked the box (assign unique group) - selected_group = groups.getUniqueEntry() + Data.selected_group = Data.groups.getUniqueEntry() onColorDialogDismiss(false) } else { // If one has just unchecked the box (unassign unique group) - selected_group = null + Data.selected_group = null onColorDialogDismiss(true) } } else { - selected_group = null + Data.selected_group = null EditPlaceColorFragment(this).show( ctx.supportFragmentManager, "AddColorDialogFragment" @@ -126,25 +116,25 @@ class GeolocListAdapter( fun onColorDialogDismiss(clear: Boolean) { if (clear) { - visits.setVisited(selected_geoloc!!, 0) - saveData() + Data.visits.setVisited(Data.selected_geoloc, 0) + Data.saveData() } - if (selected_group != null && selected_geoloc != null) { - visits.setVisited(selected_geoloc!!, selected_group!!.key) - saveData() + if (Data.selected_group != null && Data.selected_geoloc != null) { + Data.visits.setVisited(Data.selected_geoloc, Data.selected_group?.key ?: 0) + Data.saveData() } - selected_geoloc?.let { refreshCheck(it) } - selected_geoloc = null - selected_group = null + Data.selected_geoloc?.let { refreshCheck(it) } + Data.selected_geoloc = null + Data.selected_group = null } private fun refreshCheck(geoLoc: GeoLoc) { - var col = groups.getGroupFromKey(visits.getVisited(geoLoc)).color.color + var col = Data.groups.getGroupFromKey(Data.visits.getVisited(geoLoc)).color.color if (col == Color.TRANSPARENT) col = Color.GRAY checkBox.checkedState = - if (visits.getVisited(geoLoc) != 0) MaterialCheckBox.STATE_CHECKED - else if (geoLoc.children.any { visits.getVisited(it) != 0 }) MaterialCheckBox.STATE_INDETERMINATE + if (Data.visits.getVisited(geoLoc) != 0) MaterialCheckBox.STATE_CHECKED + else if (geoLoc.children.any { Data.visits.getVisited(it) != 0 }) MaterialCheckBox.STATE_INDETERMINATE else MaterialCheckBox.STATE_UNCHECKED checkBox.buttonTintList = ColorStateList( diff --git a/app/src/main/java/net/helcel/beans/activity/fragment/SettingsFragment.kt b/app/src/main/java/net/helcel/beans/activity/fragment/SettingsFragment.kt index b19f213..29a5b71 100644 --- a/app/src/main/java/net/helcel/beans/activity/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/helcel/beans/activity/fragment/SettingsFragment.kt @@ -6,23 +6,30 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import net.helcel.beans.R +import net.helcel.beans.countries.GeoLocImporter class SettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.fragment_settings, rootKey) - + val ctx = requireContext() + findPreference(getString(R.string.key_regional))?.setOnPreferenceChangeListener { _, key -> + when (key as String) { + ctx.getString(R.string.off) -> GeoLocImporter.clearStates() + ctx.getString(R.string.on) -> GeoLocImporter.importStates(ctx) + else -> GeoLocImporter.clearStates() + } + true + } // Select Light/Dark/System Mode - val themePreference = findPreference(getString(R.string.key_theme)) - themePreference?.setOnPreferenceChangeListener { _, key -> - setTheme(requireContext(), key as String) + findPreference(getString(R.string.key_theme))?.setOnPreferenceChangeListener { _, key -> + setTheme(ctx, key as String) } // Open license fragment - val licensesPreference = findPreference(getString(R.string.licenses)) - licensesPreference?.setOnPreferenceClickListener { + findPreference(getString(R.string.licenses))?.setOnPreferenceClickListener { requireActivity().supportFragmentManager.beginTransaction() .replace(R.id.fragment_view, LicenseFragment(), getString(R.string.licenses)) .commit() @@ -30,12 +37,10 @@ class SettingsFragment : PreferenceFragmentCompat() { } // Open about fragment - val aboutPreference = findPreference(getString(R.string.about)) - aboutPreference?.setOnPreferenceClickListener { + findPreference(getString(R.string.about))?.setOnPreferenceClickListener { requireActivity().supportFragmentManager.beginTransaction() .replace(R.id.fragment_view, AboutFragment(), getString(R.string.about)) .commit() - true } diff --git a/app/src/main/java/net/helcel/beans/countries/GeoLoc.kt b/app/src/main/java/net/helcel/beans/countries/GeoLoc.kt index 69e3b83..2994da5 100644 --- a/app/src/main/java/net/helcel/beans/countries/GeoLoc.kt +++ b/app/src/main/java/net/helcel/beans/countries/GeoLoc.kt @@ -1,5 +1,8 @@ package net.helcel.beans.countries +import android.content.Context +import net.helcel.beans.helper.Settings + interface GeoLoc { @@ -14,6 +17,14 @@ interface GeoLoc { val type: LocType val children: List + fun shouldShowChildren(ctx: Context): Boolean { + if (children.isEmpty()) + return false + if (type == LocType.COUNTRY && !Settings.isRegional(ctx)) + return false + return true + } + } diff --git a/app/src/main/java/net/helcel/beans/countries/GeoLocImporter.kt b/app/src/main/java/net/helcel/beans/countries/GeoLocImporter.kt index 2dc1346..b759207 100644 --- a/app/src/main/java/net/helcel/beans/countries/GeoLocImporter.kt +++ b/app/src/main/java/net/helcel/beans/countries/GeoLocImporter.kt @@ -7,7 +7,7 @@ import java.io.InputStreamReader object GeoLocImporter { - fun importState(ctx: Context) { + fun importStates(ctx: Context) { if (!Settings.isRegional(ctx)) { return } @@ -18,4 +18,8 @@ object GeoLocImporter { Country.entries.find { it.code == line[1] }?.children?.add(state) } } + + fun clearStates() { + Country.entries.forEach { it.children.clear() } + } } \ No newline at end of file diff --git a/app/src/main/java/net/helcel/beans/helper/Visits.kt b/app/src/main/java/net/helcel/beans/helper/Visits.kt index 1788129..de370b1 100644 --- a/app/src/main/java/net/helcel/beans/helper/Visits.kt +++ b/app/src/main/java/net/helcel/beans/helper/Visits.kt @@ -9,9 +9,11 @@ import java.io.InputStream @Serializable -class Visits(val id: Int, private val locs: HashMap) { +class Visits(val id: Int, private val locs: HashMap) { - fun setVisited(key: GeoLoc, b: Int) { + fun setVisited(key: GeoLoc?, b: Int) { + if (b == 0 || key == null) + return locs[key.code] = b } @@ -25,10 +27,11 @@ class Visits(val id: Int, private val locs: HashMap) { } fun getVisited(key: GeoLoc): Int { - return locs.getOrDefault(key.code,0) + return locs.getOrDefault(key.code, 0) } + private fun getVisited(key: String): Int { - return locs.getOrDefault(key,0) + return locs.getOrDefault(key, 0) } fun countVisited(key: Int): Int { @@ -43,14 +46,14 @@ class Visits(val id: Int, private val locs: HashMap) { @Serializer(Visits::class) class VisitsSerializer { val defaultValue: Visits - get() = Visits(Int.MIN_VALUE,hashMapOf()) + get() = Visits(Int.MIN_VALUE, hashMapOf()) fun readFrom(input: InputStream): Visits { - return Json.decodeFromString(serializer(),input.readBytes().decodeToString()) + return Json.decodeFromString(serializer(), input.readBytes().decodeToString()) } - fun writeTo(t: Visits): String { - return Json.encodeToString(serializer(),t).encodeToByteArray().decodeToString() + fun writeTo(t: Visits): String { + return Json.encodeToString(serializer(), t).encodeToByteArray().decodeToString() } } diff --git a/app/src/main/java/net/helcel/beans/svg/CSSWrapper.kt b/app/src/main/java/net/helcel/beans/svg/CSSWrapper.kt index 4ec5ae0..3548a3f 100644 --- a/app/src/main/java/net/helcel/beans/svg/CSSWrapper.kt +++ b/app/src/main/java/net/helcel/beans/svg/CSSWrapper.kt @@ -18,13 +18,12 @@ class CSSWrapper(ctx: Context) { private var customCSS: String = "" init { - val www = World.WWW.children.joinToString(",") { "#${it.code}2" } - val ccc = - World.WWW.children.joinToString(",") { itt -> itt.children.joinToString(",") { "#${it.code}2" } } - baseCSS = - "svg{fill:$colorForeground;stroke:$colorBackground;stroke-width:0.01;}" + - "$www,$ccc{stroke-width:0.1;fill:none}" + val ccc = World.WWW.children.joinToString(",") { itt -> + itt.children.joinToString(",") { "#${it.code}2" } + } + baseCSS = "svg{fill:$colorForeground;stroke:$colorBackground;stroke-width:0.01;}" + + "$www,$ccc{stroke:$colorBackground;stroke-width:0.1;fill:none}" refresh() }