diff --git a/app/build.gradle b/app/build.gradle
index 245a569..5988d60 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,16 +1,17 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
+ id 'com.mikepenz.aboutlibraries.plugin' version '10.10.0'
}
android {
namespace 'net.helcel.beendroid'
- compileSdk 33
+ compileSdk 34
defaultConfig {
applicationId 'net.helcel.beendroid'
minSdk 28
- targetSdk 33
+ targetSdk 34
versionCode 1
versionName "1.0"
@@ -50,5 +51,6 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation 'com.caverock:androidsvg-aar:1.4'
+ implementation "com.mikepenz:aboutlibraries:10.10.0"
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 13b483f..e6296b5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,14 +16,20 @@
>
+ android:exported="true" >
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt b/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt
new file mode 100644
index 0000000..0001d9c
--- /dev/null
+++ b/app/src/main/java/net/helcel/beendroid/activity/AboutFragment.kt
@@ -0,0 +1,31 @@
+package net.helcel.beendroid.activity
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import net.helcel.beendroid.databinding.FragmentAboutBinding
+
+class AboutFragment: Fragment() {
+ private var _binding: FragmentAboutBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentAboutBinding.inflate(inflater, container, false)
+
+ return binding.root
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
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 c7cca73..379bbb2 100644
--- a/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt
+++ b/app/src/main/java/net/helcel/beendroid/activity/FoldingListAdapter.kt
@@ -1,17 +1,20 @@
package net.helcel.beendroid.activity
import android.content.Context
+import android.graphics.Color
+import android.graphics.Typeface
+import android.graphics.drawable.ColorDrawable
+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
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.checkbox.MaterialCheckBox
import net.helcel.beendroid.R
import net.helcel.beendroid.countries.GeoLoc
+import net.helcel.beendroid.countries.LocType
import net.helcel.beendroid.countries.Visited
import java.util.*
@@ -36,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) {
@@ -60,46 +60,52 @@ class FoldingListAdapter(
class FoldingListViewHolder(private val ctx: Context, itemView: View,
private val visited: Visited,
) : RecyclerView.ViewHolder(itemView) {
- private val textView: TextView
- private val expand: ImageView
- 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)
- expand.setImageDrawable(AppCompatResources.getDrawable(ctx,R.drawable.chevron_right_solid))
- 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.GONE
textView.text = el.first.fullName
+ if (el.first.type == LocType.GROUP) {
+ textView.setTypeface(null, Typeface.BOLD)
+
+ val colorGrayTyped = TypedValue()
+ 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())
+ list.adapter = FoldingListAdapter(ctx, el.first.children,visited, parentLambda)
+ textView.parent.parent.requestChildFocus(textView,textView)
+
+ } else {
+ val colorBackgroundTyped = TypedValue()
+ ctx.theme.resolveAttribute(android.R.attr.colorBackground, colorBackgroundTyped, true)
+ textView.backgroundTintList = null
+ textView.background = ColorDrawable(colorBackgroundTyped.data)
+ textView.isActivated = false
+
+ val layoutParam = checkBox.layoutParams
+ layoutParam.width = 125
+ checkBox.layoutParams = layoutParam
+ checkBox.visibility = View.VISIBLE
+ }
checkBox.checkedState =
- if(visited.visited(el.first)) MaterialCheckBox.STATE_CHECKED
+ if (visited.visited(el.first)) MaterialCheckBox.STATE_CHECKED
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 { checkBox.toggle() }
+ textView.setOnClickListener { expandLambda() }
checkBox.addOnCheckedStateChangedListener { _, e ->
visitedLambda(e == MaterialCheckBox.STATE_CHECKED)
}
-
- textView.setOnLongClickListener{ expandLambda() }
- 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
new file mode 100644
index 0000000..ee964e9
--- /dev/null
+++ b/app/src/main/java/net/helcel/beendroid/activity/LicenseFragment.kt
@@ -0,0 +1,41 @@
+package net.helcel.beendroid.activity
+
+import android.os.Bundle
+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.FragmentLicenseBinding
+import com.mikepenz.aboutlibraries.LibsBuilder
+
+class LicenseFragment: Fragment() {
+ private var _binding: FragmentLicenseBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentLicenseBinding.inflate(inflater, container, false)
+
+ val librariesFragment = LibsBuilder()
+ .withLicenseShown(true)
+ .supportFragment()
+
+ requireActivity().supportFragmentManager.beginTransaction()
+ .replace(R.id.license_fragment_view, librariesFragment)
+ .commit()
+
+ return binding.root
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
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 a45386b..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,9 +1,19 @@
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.drawable.ColorDrawable
import android.os.Bundle
+import android.util.TypedValue
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.MenuProvider
+import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.caverock.androidsvg.RenderOptions
@@ -17,6 +27,8 @@ import net.helcel.beendroid.svg.PSVGWrapper
class MainActivity : AppCompatActivity() {
+ private lateinit var sharedPreferences: SharedPreferences
+
private lateinit var map : SVGImageView
private lateinit var list : RecyclerView
@@ -24,32 +36,103 @@ 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)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- canvas.drawRGB(255, 255, 255)
+ // Create action bar
+ val colorPrimaryTyped = TypedValue()
+ theme.resolveAttribute(android.R.attr.colorPrimary, colorPrimaryTyped, true)
+ supportActionBar?.setBackgroundDrawable(ColorDrawable(colorPrimaryTyped.data))
+ // Fetch shared preferences to restore app theme upon startup
+ sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
+ SettingsFragment.setTheme(this, sharedPreferences.getString(getString(R.string.key_theme), getString(R.string.system)))
+
+ // Create menu in action bar
+ addMenuProvider(object : MenuProvider {
+ override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+ menuInflater.inflate(R.menu.menu_main, menu)
+ }
+
+ override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+ return when (menuItem.itemId) {
+ R.id.action_edit -> {
+ // 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))
+ true
+ }
+ else -> {
+ false
+ }
+ }
+ }
+
+ })
+
+ // Restore visited countries
visited = Visited(this)
visited.load()
+ // Wrap lists of countries
psvg = PSVGWrapper(this)
css = CSSWrapper(visited)
+ // Populate map from list of countries
setContentView(R.layout.activity_main)
map = findViewById(R.id.map)
map.setImageBitmap(bitmap)
+ refreshMapDisplay(refreshMapCompute())
- refreshMap()
-
+ // 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(){
- psvg.get().renderToCanvas(canvas,RenderOptions.create().css(css.get()))
+ 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_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
new file mode 100644
index 0000000..e06fba4
--- /dev/null
+++ b/app/src/main/java/net/helcel/beendroid/activity/SettingsActivity.kt
@@ -0,0 +1,62 @@
+package net.helcel.beendroid.activity
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.util.TypedValue
+import android.view.MenuItem
+import androidx.appcompat.app.AppCompatActivity
+import net.helcel.beendroid.R
+
+class SettingsActivity: AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ // Bind activity to XML layout with fragment view
+ setContentView(R.layout.activity_settings)
+
+ // Create action bar
+ val colorPrimaryTyped = TypedValue()
+ theme.resolveAttribute(android.R.attr.colorPrimary, colorPrimaryTyped, true)
+ supportActionBar?.setBackgroundDrawable(ColorDrawable(colorPrimaryTyped.data))
+ supportActionBar?.title = getString(R.string.action_settings)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+ // Populate activity with settings fragment
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_view, SettingsFragment(), getString(R.string.action_settings))
+ .commit()
+
+ // Change title in action bar according to current fragment
+ supportFragmentManager.addFragmentOnAttachListener { _, _ ->
+ supportActionBar?.title = supportFragmentManager.findFragmentById(R.id.fragment_view).let {
+ when (it) {
+ is LicenseFragment -> getString(R.string.licenses)
+ is AboutFragment -> getString(R.string.about)
+ else -> getString(R.string.action_settings)
+ }
+ }
+ }
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ // Configure on back pressed
+ supportFragmentManager.findFragmentById(R.id.fragment_view).let {
+ when (it) {
+ is LicenseFragment, is AboutFragment -> {
+ supportFragmentManager.beginTransaction()
+ .remove(it)
+ .commit()
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_view, SettingsFragment(), getString(R.string.action_settings))
+ .commit()
+ supportActionBar?.title = getString(R.string.action_settings)
+ }
+ else -> {
+ finish()
+ }
+ }
+ }
+ return super.onOptionsItemSelected(item)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt b/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt
new file mode 100644
index 0000000..6378e15
--- /dev/null
+++ b/app/src/main/java/net/helcel/beendroid/activity/SettingsFragment.kt
@@ -0,0 +1,70 @@
+package net.helcel.beendroid.activity
+
+import android.content.Context
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.preference.ListPreference
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+import net.helcel.beendroid.R
+
+
+class SettingsFragment: PreferenceFragmentCompat() {
+ private lateinit var themePreference: ListPreference
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.fragment_settings, rootKey)
+
+ // Select Light/Dark/System Mode
+ themePreference = findPreference(getString(R.string.key_theme))!!
+ themePreference.setOnPreferenceChangeListener { _, key ->
+ setTheme(requireContext(), key as String)
+ }
+
+ val aboutPreference = findPreference(getString(R.string.about))
+ aboutPreference?.setOnPreferenceClickListener {
+ requireActivity().supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_view, AboutFragment(), getString(R.string.about))
+ .commit()
+
+ true
+ }
+
+ val licensesPreference = findPreference(getString(R.string.licenses))
+ licensesPreference?.setOnPreferenceClickListener {
+ requireActivity().supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_view, LicenseFragment(), getString(R.string.licenses))
+ .commit()
+ true
+ }
+
+ }
+
+ companion object {
+ fun setTheme(context: Context, key: String?): Boolean {
+ when (key) {
+ context.getString(R.string.system) -> {
+ // Set SYSTEM Theme
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
+ return true
+ }
+
+ context.getString(R.string.light) -> {
+ // Set LIGHT Theme
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
+ return true
+ }
+
+ context.getString(R.string.dark) -> {
+ // Set DARK Theme
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
+ return true
+ }
+
+ else -> {
+ return false
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/helcel/beendroid/countries/Visited.kt b/app/src/main/java/net/helcel/beendroid/countries/Visited.kt
index 07c1a97..b7513fa 100644
--- a/app/src/main/java/net/helcel/beendroid/countries/Visited.kt
+++ b/app/src/main/java/net/helcel/beendroid/countries/Visited.kt
@@ -10,13 +10,13 @@ class Visited(ctx: Context) {
fun load() {
- Group.values().forEach {
+ Group.entries.forEach {
locs[it] = pref.getBoolean(it.code, false)
}
- Country.values().forEach {
+ Country.entries.forEach {
locs[it] = pref.getBoolean(it.code, false)
}
- State.values().forEach {
+ State.entries.forEach {
locs[it] = pref.getBoolean(it.code, false)
}
editor.apply()
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 d5705ec..1ad9312 100644
--- a/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt
+++ b/app/src/main/java/net/helcel/beendroid/svg/CSSWrapper.kt
@@ -5,16 +5,18 @@ import net.helcel.beendroid.countries.World
class CSSWrapper(private val visited: Visited) {
+ private val colorPrimary = "#0187FF"
+
fun get() : String {
return listOf(World.WWW.children
.filter { visited.visited(it)}
- .map { ".${it.code}{fill:blue;}"}
+ .map { ".${it.code}{fill:$colorPrimary;}"}
.fold(""){acc, s-> acc + s},
World.WWW.children
.filter { !visited.visited(it) }
.map { cg -> cg.children
.filter { visited.visited(it) }
- .map { ".${it.code}{fill:blue;}"}
+ .map { ".${it.code}{fill:$colorPrimary;}"}
.fold(""){acc, s-> acc + s}
}.fold(""){acc,s->acc+s},
).fold(""){acc,s-> acc+s}
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 30b5f11..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,6 +1,7 @@
package net.helcel.beendroid.svg
import android.content.Context
+import android.util.TypedValue
import com.caverock.androidsvg.SVG
import net.helcel.beendroid.countries.Country
import net.helcel.beendroid.countries.GeoLoc
@@ -11,8 +12,20 @@ class PSVGWrapper(ctx: Context) {
private val cm = HashMap()
private var fm = ""
+ private val colorForeground: String
+ private val colorBackground: String
+
init {
- Country.values().forEach {
+ val colorSecondaryTyped = TypedValue()
+ ctx.theme.resolveAttribute(android.R.attr.panelColorBackground, colorSecondaryTyped, true)
+ colorForeground = "\"#${Integer.toHexString(colorSecondaryTyped.data).subSequence(2, 8)}\""
+
+ val colorBackgroundTyped = TypedValue()
+ ctx.theme.resolveAttribute(android.R.attr.colorBackground, colorBackgroundTyped, true)
+ colorBackground = "\"#${Integer.toHexString(colorBackgroundTyped.data).subSequence(2, 8)}\""
+
+
+ Country.entries.forEach {
cm[it] = PSVGLoader(ctx, it, Level.ZERO).load()
}
build()
@@ -31,12 +44,12 @@ class PSVGWrapper(ctx: Context) {
}.fold("") { acc, e -> acc + e }
}
- fun get(): SVG {
- return SVG.getFromString("")
+ fun getFill(): SVG {
+ return SVG.getFromString("")
}
-
-
-
+ fun getDraw(): SVG {
+ return SVG.getFromString("")
+ }
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
index 2b068d1..c92c40d 100644
--- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -1,30 +1,14 @@
-
-
-
-
-
-
-
-
+ android:width="12dp"
+ android:height="12dp"
+ android:viewportWidth="1600"
+ android:viewportHeight="1600" >
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/checklist.xml b/app/src/main/res/drawable/checklist.xml
new file mode 100644
index 0000000..1ecc582
--- /dev/null
+++ b/app/src/main/res/drawable/checklist.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/chevron_right_solid.xml b/app/src/main/res/drawable/chevron.xml
similarity index 89%
rename from app/src/main/res/drawable/chevron_right_solid.xml
rename to app/src/main/res/drawable/chevron.xml
index a66bef1..6d21775 100644
--- a/app/src/main/res/drawable/chevron_right_solid.xml
+++ b/app/src/main/res/drawable/chevron.xml
@@ -4,6 +4,6 @@
android:viewportWidth="320"
android:viewportHeight="512">
diff --git a/app/src/main/res/drawable/edit.xml b/app/src/main/res/drawable/edit.xml
new file mode 100644
index 0000000..5cd1ea2
--- /dev/null
+++ b/app/src/main/res/drawable/edit.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 07d5da9..01d1b63 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -2,169 +2,9 @@
+ android:viewportWidth="960"
+ android:viewportHeight="960">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:fillColor="#FF0187FF"
+ android:pathData="M0,0h960v960h-960z" />
diff --git a/app/src/main/res/drawable/info.xml b/app/src/main/res/drawable/info.xml
new file mode 100644
index 0000000..9cd6750
--- /dev/null
+++ b/app/src/main/res/drawable/info.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/palette.xml b/app/src/main/res/drawable/palette.xml
new file mode 100644
index 0000000..7585f6d
--- /dev/null
+++ b/app/src/main/res/drawable/palette.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index ea24711..bd4166a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -2,10 +2,11 @@
+ android:theme="@style/Theme.Beendroid"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
-
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
new file mode 100644
index 0000000..6ca9d0e
--- /dev/null
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml
new file mode 100644
index 0000000..0df3bbf
--- /dev/null
+++ b/app/src/main/res/layout/fragment_license.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml
index 784e61d..c370cae 100644
--- a/app/src/main/res/layout/item_list.xml
+++ b/app/src/main/res/layout/item_list.xml
@@ -1,7 +1,6 @@
@@ -9,54 +8,61 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
+ app:layout_constraintVertical_bias="1.0" />
+
+
-
-
+ app:layout_constraintTop_toBottomOf="@id/checkBox">
+ tools:context="net.helcel.beendroid.activity.MainActivity" >
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index bb4a9b8..4ea58db 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,5 +1,9 @@
-
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..f5052d1
--- /dev/null
+++ b/app/src/main/res/values/arrays.xml
@@ -0,0 +1,8 @@
+
+
+
+ - @string/system
+ - @string/light
+ - @string/dark
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ac343a4
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,13 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03AFFF
+ #FF0187FF
+ #FFFFDD00
+ #FF000000
+ #FF555555
+ #FFBBBBBB
+ #FFFFFFFF
+
diff --git a/app/src/main/res/values/en.xml b/app/src/main/res/values/en.xml
index 990ea40..3dc5f7d 100644
--- a/app/src/main/res/values/en.xml
+++ b/app/src/main/res/values/en.xml
@@ -1,8 +1,20 @@
- Beendroid
+ BeenDroid
+ 1.0
Settings
-
+ Stats
+ Edit
Welcome!
Change language
+ App theme
+ System
+ Light
+ Dark
+ Licenses
+ About
+ BeenDroid is free and open source software, licensed under the GNU General Public License (version 3 or later)
+ Project repository: https://git.helcel.net/helcel/beendroid\n Feel free to report issues or contribute to the project.
+ Free and open source dependencies and licenses
+ About the BeenDroid application
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 89c86e9..db354af 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,14 +1,9 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/fragment_settings.xml b/app/src/main/res/xml/fragment_settings.xml
new file mode 100644
index 0000000..2f6b780
--- /dev/null
+++ b/app/src/main/res/xml/fragment_settings.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 34c822e..9377a07 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -14,5 +14,5 @@ dependencyResolutionManagement {
maven { url 'https://jitpack.io' }
}
}
-rootProject.name = "beendroid"
+rootProject.name = "BeenDroid"
include ':app'