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("$fm") + fun getFill(): SVG { + return SVG.getFromString("$fm") } - - - + fun getDraw(): SVG { + return SVG.getFromString("$fm") + } } \ 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 @@ - - - - -