From 84a8a1fe13b5983d9295454f349d5407f72abd94 Mon Sep 17 00:00:00 2001 From: soraefir Date: Sat, 20 Jan 2024 01:19:19 +0100 Subject: [PATCH] Clean up, parallel compute,... --- app/src/main/AndroidManifest.xml | 1 - .../beendroid/activity/AboutFragment.kt | 1 - .../beendroid/activity/FoldingListAdapter.kt | 43 +++---------------- .../beendroid/activity/LicenseFragment.kt | 4 -- .../helcel/beendroid/activity/MainActivity.kt | 38 +++++++++++++--- .../beendroid/activity/SettingsActivity.kt | 4 -- .../beendroid/activity/SettingsFragment.kt | 2 - .../net/helcel/beendroid/svg/CSSWrapper.kt | 1 - .../net/helcel/beendroid/svg/PSVGWrapper.kt | 4 -- app/src/main/res/layout/item_list.xml | 1 - app/src/main/res/menu/menu_main.xml | 9 +++- app/src/main/res/values/en.xml | 1 + 12 files changed, 48 insertions(+), 61 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 805e8eb..e6296b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,7 +27,6 @@ android:exported="true" > - diff --git a/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt b/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt index 1f9bffd..0001d9c 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import net.helcel.beendroid.R import net.helcel.beendroid.databinding.FragmentAboutBinding class AboutFragment: Fragment() { diff --git a/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt b/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt index 44581de..379bbb2 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt @@ -4,17 +4,13 @@ import android.content.Context import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable -import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView import android.widget.TextView -import androidx.appcompat.content.res.AppCompatResources.getDrawable import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.button.MaterialButton import com.google.android.material.checkbox.MaterialCheckBox import net.helcel.beendroid.R import net.helcel.beendroid.countries.GeoLoc @@ -43,10 +39,7 @@ class FoldingListAdapter( override fun onBindViewHolder(holder: FoldingListViewHolder, position: Int) { val el = cg.toList()[position] - holder.bind(el) { - notifyItemChanged(position) - parentLambda() - } + holder.bind(el) { parentLambda() } holder.addListeners( { if (!el.first.isEnd) { @@ -67,25 +60,16 @@ class FoldingListAdapter( class FoldingListViewHolder(private val ctx: Context, itemView: View, private val visited: Visited, ) : RecyclerView.ViewHolder(itemView) { - private val textView: TextView - //private val expand: MaterialButton - private val checkBox: MaterialCheckBox - private val subItemView: View - private val list: RecyclerView - + private val textView: TextView = itemView.findViewById(R.id.textView) + private val checkBox: MaterialCheckBox = itemView.findViewById(R.id.checkBox) + private val subItemView: View = itemView.findViewById(R.id.sub_item) + private val list: RecyclerView = itemView.findViewById(R.id.list_list) init { - textView = itemView.findViewById(R.id.textView) - //expand = itemView.findViewById(R.id.expand) - checkBox = itemView.findViewById(R.id.checkBox) - subItemView = itemView.findViewById(R.id.sub_item) - list = itemView.findViewById(R.id.list_list) list.layoutManager = LinearLayoutManager(ctx, RecyclerView.VERTICAL, false) } fun bind(el: Pair, parentLambda: () -> Unit) { - //expand.rotation = if(el.second) 90f else 0f subItemView.visibility = if (el.second) View.VISIBLE else View.GONE - //expand.visibility = if(!el.first.isEnd) View.VISIBLE else View.INVISIBLE textView.text = el.first.fullName if (el.first.type == LocType.GROUP) { @@ -95,15 +79,9 @@ class FoldingListAdapter( ctx.theme.resolveAttribute(android.R.attr.panelColorBackground, colorGrayTyped, true) val color = Color.valueOf(colorGrayTyped.data) textView.setBackgroundColor(Color.valueOf(color.red(), color.green(), color.blue(), 0.5f).toArgb()) - checkBox.visibility = View.INVISIBLE + list.adapter = FoldingListAdapter(ctx, el.first.children,visited, parentLambda) + textView.parent.parent.requestChildFocus(textView,textView) - el.first.children.apply { - val nbCountries = this.size - val nbVisited = this.map { if (visited.visited(it)) 1 else 0 }.reduce{ a, b -> (a + b) } - val ratio = nbVisited.toFloat() / nbCountries.toFloat() - val percentage = (ratio * 100).toInt() - textView.text = "${textView.text as String} (${percentage}%)" - } } else { val colorBackgroundTyped = TypedValue() ctx.theme.resolveAttribute(android.R.attr.colorBackground, colorBackgroundTyped, true) @@ -114,7 +92,6 @@ class FoldingListAdapter( val layoutParam = checkBox.layoutParams layoutParam.width = 125 checkBox.layoutParams = layoutParam - checkBox.visibility = View.VISIBLE } checkBox.checkedState = @@ -122,19 +99,13 @@ class FoldingListAdapter( else if (el.first.children.any { visited.visited(it) }) MaterialCheckBox.STATE_INDETERMINATE else MaterialCheckBox.STATE_UNCHECKED - textView.parent.parent.requestChildFocus(textView,textView) - list.adapter = FoldingListAdapter(ctx, el.first.children,visited, parentLambda) } fun addListeners(expandLambda: ()->Boolean, visitedLambda: (Boolean)->Unit) { - textView.setOnClickListener { expandLambda() } checkBox.addOnCheckedStateChangedListener { _, e -> visitedLambda(e == MaterialCheckBox.STATE_CHECKED) } - - //textView.setOnLongClickListener{ checkBox.toggle(); true } - //expand.setOnClickListener { expandLambda() } } } diff --git a/app/src/main/java/net/helcel/beendroid/activity/LicenseFragment.kt b/app/src/main/java/net/helcel/beendroid/activity/LicenseFragment.kt index b1ad05f..ee964e9 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/LicenseFragment.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/LicenseFragment.kt @@ -2,13 +2,9 @@ package net.helcel.beendroid.activity import android.os.Bundle import android.view.LayoutInflater -import android.view.MenuItem import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.ActionBar -import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment -import com.mikepenz.aboutlibraries.Libs import net.helcel.beendroid.R import net.helcel.beendroid.databinding.FragmentLicenseBinding import com.mikepenz.aboutlibraries.LibsBuilder diff --git a/app/src/main/java/net/helcel/beendroid/activity/MainActivity.kt b/app/src/main/java/net/helcel/beendroid/activity/MainActivity.kt index 853cea5..5bb5699 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/MainActivity.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/MainActivity.kt @@ -1,13 +1,12 @@ package net.helcel.beendroid.activity +import kotlinx.coroutines.* import android.content.Intent import android.content.SharedPreferences import android.graphics.Bitmap import android.graphics.Canvas -import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle -import android.util.Log import android.util.TypedValue import android.view.Menu import android.view.MenuInflater @@ -37,6 +36,8 @@ class MainActivity : AppCompatActivity() { private lateinit var psvg : PSVGWrapper private lateinit var css : CSSWrapper + private var processor: ImageProcessor = ImageProcessor({ refreshMapCompute() },{ refreshMapDisplay(it) }) + private val bitmap: Bitmap = Bitmap.createBitmap(1200,900, Bitmap.Config.ARGB_8888) private val canvas = Canvas(bitmap) @@ -64,6 +65,10 @@ class MainActivity : AppCompatActivity() { // TODO: Enable editing selected countries true } + R.id.action_stats -> { + // TODO: Write stats activity + true + } R.id.action_settings -> { // Open settings startActivity(Intent(this@MainActivity, SettingsActivity::class.java)) @@ -89,24 +94,45 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) map = findViewById(R.id.map) map.setImageBitmap(bitmap) - refreshMap() + refreshMapDisplay(refreshMapCompute()) // Populate list below the map list = findViewById(R.id.list) list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) - list.adapter = FoldingListAdapter(this, World.WWW.children, visited) { refreshMap() } + list.adapter = FoldingListAdapter(this, World.WWW.children, visited) { processor.process() } } - private fun refreshMap(){ + private fun refreshMapDisplay(css_value: String){ // Set or reset background (replaces canvas.drawColor(0, 0, 0)) val colorBackgroundTyped = TypedValue() theme.resolveAttribute(android.R.attr.colorBackground, colorBackgroundTyped, true) canvas.drawColor(colorBackgroundTyped.data) // Render all countries and visited ones - psvg.getFill().renderToCanvas(canvas, RenderOptions.create().css(css.get())) + psvg.getFill().renderToCanvas(canvas, RenderOptions.create().css(css_value)) // Render all contours in the same color as the background to make them much clearer psvg.getDraw().renderToCanvas(canvas) } + + private fun refreshMapCompute() : String { + return css.get() + } + + + + class ImageProcessor(private val refreshMapCompute: ()->String, private val refreshMapDisplay: (String)->Unit) { + + private var currentJob : Job? = null + fun process() { + currentJob?.cancel() + currentJob = CoroutineScope(Dispatchers.Main).launch { + try { + refreshMapDisplay(refreshMapCompute()) + } catch (_: CancellationException) { + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/net/helcel/beendroid/activity/SettingsActivity.kt b/app/src/main/java/net/helcel/beendroid/activity/SettingsActivity.kt index 693f6ab..e06fba4 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/SettingsActivity.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/SettingsActivity.kt @@ -1,14 +1,10 @@ package net.helcel.beendroid.activity import android.graphics.drawable.ColorDrawable -import android.content.Intent import android.os.Bundle -import android.os.PersistableBundle import android.util.TypedValue import android.view.MenuItem -import androidx.activity.addCallback import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.findNavController import net.helcel.beendroid.R class SettingsActivity: AppCompatActivity() { diff --git a/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt b/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt index 7746282..6378e15 100644 --- a/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt +++ b/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt @@ -1,9 +1,7 @@ package net.helcel.beendroid.activity import android.content.Context -import android.graphics.drawable.ColorDrawable import android.os.Bundle -import android.util.TypedValue import androidx.appcompat.app.AppCompatDelegate import androidx.preference.ListPreference import androidx.preference.Preference diff --git a/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt b/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt index e95e26e..1ad9312 100644 --- a/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt +++ b/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt @@ -1,6 +1,5 @@ package net.helcel.beendroid.svg -import android.util.TypedValue import net.helcel.beendroid.countries.Visited import net.helcel.beendroid.countries.World diff --git a/app/src/main/java/net/helcel/beendroid/svg/PSVGWrapper.kt b/app/src/main/java/net/helcel/beendroid/svg/PSVGWrapper.kt index 8471add..46bc8ee 100644 --- a/app/src/main/java/net/helcel/beendroid/svg/PSVGWrapper.kt +++ b/app/src/main/java/net/helcel/beendroid/svg/PSVGWrapper.kt @@ -1,12 +1,8 @@ package net.helcel.beendroid.svg import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.util.Log import android.util.TypedValue import com.caverock.androidsvg.SVG -import net.helcel.beendroid.R import net.helcel.beendroid.countries.Country import net.helcel.beendroid.countries.GeoLoc import net.helcel.beendroid.countries.World diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index b5f2bfa..c370cae 100644 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -1,7 +1,6 @@ diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 1bdac49..a4d5745 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -10,10 +10,17 @@ android:visible="false" android:title="@string/action_edit" app:showAsAction="ifRoom" /> - + + \ No newline at end of file diff --git a/app/src/main/res/values/en.xml b/app/src/main/res/values/en.xml index e82a8ab..3dc5f7d 100644 --- a/app/src/main/res/values/en.xml +++ b/app/src/main/res/values/en.xml @@ -3,6 +3,7 @@ BeenDroid 1.0 Settings + Stats Edit Welcome! Change language