Add picker for unit types for conversion

This commit is contained in:
Ensar Sarajčić
2023-09-11 14:33:34 +02:00
parent 7df4f4e643
commit 6fc4d8a5bb
18 changed files with 227 additions and 42 deletions

View File

@@ -38,6 +38,10 @@
android:name=".activities.UnitConverterActivity"
android:exported="false" />
<activity
android:name=".activities.UnitConverterPickerActivity"
android:exported="false" />
<activity
android:name=".activities.WidgetConfigureActivity"
android:exported="true"

View File

@@ -177,7 +177,7 @@ class MainActivity : SimpleActivity(), Calculator {
private fun launchUnitConverter() {
hideKeyboard()
startActivity(Intent(applicationContext, UnitConverterActivity::class.java))
startActivity(Intent(applicationContext, UnitConverterPickerActivity::class.java))
}
private fun launchSettings() {

View File

@@ -17,10 +17,13 @@ import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA_INT
import com.simplemobiletools.commons.helpers.NavigationIcon
class UnitConverterActivity : SimpleActivity() {
companion object {
const val EXTRA_CONVERTER_ID = "converter_id"
}
private val binding by viewBinding(ActivityUnitConverterBinding::inflate)
private var storedTextColor = 0
private var vibrateOnButtonPress = true
private var storedUseCommaAsDecimalMark = false
private lateinit var converter: Converter
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
@@ -29,13 +32,15 @@ class UnitConverterActivity : SimpleActivity() {
appLaunched(BuildConfig.APPLICATION_ID)
updateMaterialActivityViews(binding.unitConverterCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = false)
setupMaterialScrollListener(binding.nestedScrollview, binding.unitConverterToolbar)
storeStateVariables()
binding.viewUnitConverter.unitsTabLayout.onTabSelectionChanged(
tabSelectedAction = {
binding.viewUnitConverter.viewConverter.root.setConverter(Converter.ALL[it.id])
val converter = Converter.ALL.getOrNull(intent.getIntExtra(EXTRA_CONVERTER_ID, 0))
if (converter == null) {
finish()
return
}
)
this.converter = converter
binding.viewUnitConverter.btnClear.setVibratingOnClickListener {
binding.viewUnitConverter.viewConverter.root.clear()
}
@@ -46,32 +51,21 @@ class UnitConverterActivity : SimpleActivity() {
}
}
Converter.ALL.forEachIndexed { index, converter ->
binding.viewUnitConverter.unitsTabLayout.newTab()
.setId(index)
.setText(converter.nameResId)
.apply { binding.viewUnitConverter.unitsTabLayout.addTab(this) }
}
binding.viewUnitConverter.viewConverter.root.setConverter(Converter.ALL.first())
binding.viewUnitConverter.viewConverter.root.setConverter(converter)
}
override fun onResume() {
super.onResume()
setupToolbar(binding.unitConverterToolbar, NavigationIcon.Cross)
binding.viewUnitConverter.unitsTabLayout.setBackgroundColor(getProperBackgroundColor())
binding.viewUnitConverter.viewConverter.root.updateColors()
if (storedTextColor != config.textColor) {
binding.viewUnitConverter.converterHolder.let { updateViewColors(it, getProperTextColor()) }
}
if (config.preventPhoneFromSleeping) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
if (storedUseCommaAsDecimalMark != config.useCommaAsDecimalMark) {
setupDecimalSeparator()
}
vibrateOnButtonPress = config.vibrateOnButtonPress
@@ -90,19 +84,11 @@ class UnitConverterActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
storeStateVariables()
if (config.preventPhoneFromSleeping) {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
private fun storeStateVariables() {
config.apply {
storedTextColor = textColor
storedUseCommaAsDecimalMark = useCommaAsDecimalMark
}
}
private fun checkHaptic(view: View) {
if (vibrateOnButtonPress) {
view.performHapticFeedback()
@@ -121,10 +107,9 @@ class UnitConverterActivity : SimpleActivity() {
}
private fun setupDecimalSeparator() {
var decimalSeparator = DOT
var groupingSeparator = COMMA
storedUseCommaAsDecimalMark = config.useCommaAsDecimalMark
if (storedUseCommaAsDecimalMark) {
val decimalSeparator: String
val groupingSeparator: String
if (config.useCommaAsDecimalMark) {
decimalSeparator = COMMA
groupingSeparator = DOT
} else {

View File

@@ -0,0 +1,53 @@
package com.simplemobiletools.calculator.activities
import android.content.Intent
import android.os.Bundle
import android.view.WindowManager
import com.simplemobiletools.calculator.BuildConfig
import com.simplemobiletools.calculator.R
import com.simplemobiletools.calculator.adapters.UnitTypesAdapter
import com.simplemobiletools.calculator.databinding.ActivityUnitConverterPickerBinding
import com.simplemobiletools.calculator.extensions.config
import com.simplemobiletools.calculator.helpers.converters.Converter
import com.simplemobiletools.commons.extensions.appLaunched
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.commons.views.AutoGridLayoutManager
class UnitConverterPickerActivity : SimpleActivity() {
private val binding by viewBinding(ActivityUnitConverterPickerBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
updateMaterialActivityViews(binding.unitConverterPickerCoordinator, null, useTransparentNavigation = false, useTopSearchMenu = false)
setupMaterialScrollListener(binding.unitTypesGrid, binding.unitConverterPickerToolbar)
binding.unitTypesGrid.layoutManager = AutoGridLayoutManager(this, resources.getDimensionPixelSize(R.dimen.unit_type_size))
binding.unitTypesGrid.adapter = UnitTypesAdapter(this, Converter.ALL) {
Intent(this, UnitConverterActivity::class.java).apply {
putExtra(UnitConverterActivity.EXTRA_CONVERTER_ID, it)
startActivity(this)
}
}
}
override fun onResume() {
super.onResume()
setupToolbar(binding.unitConverterPickerToolbar, NavigationIcon.Cross)
if (config.preventPhoneFromSleeping) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
override fun onPause() {
super.onPause()
if (config.preventPhoneFromSleeping) {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
}

View File

@@ -0,0 +1,42 @@
package com.simplemobiletools.calculator.adapters
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.calculator.activities.SimpleActivity
import com.simplemobiletools.calculator.databinding.ItemUnitTypeBinding
import com.simplemobiletools.calculator.helpers.converters.Converter
import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.getProperTextColor
class UnitTypesAdapter (val activity: SimpleActivity, val items: List<Converter>, val itemClick: (id: Int) -> Unit) : RecyclerView.Adapter<UnitTypesAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(ItemUnitTypeBinding.inflate(activity.layoutInflater, parent, false))
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.bindView(item, position)
}
override fun getItemCount() = items.size
inner class ViewHolder(private val binding: ItemUnitTypeBinding) : RecyclerView.ViewHolder(binding.root) {
fun bindView(item: Converter, id: Int): View {
itemView.apply {
binding.unitImage.setImageResource(item.imageResId)
binding.unitLabel.setText(item.nameResId)
binding.unitLabel.setTextColor(activity.getProperTextColor())
binding.unitImage.applyColorFilter(activity.getProperPrimaryColor())
setOnClickListener {
itemClick(id)
}
}
return itemView
}
}
}

View File

@@ -4,6 +4,7 @@ import com.simplemobiletools.calculator.R
object AreaConverter : Converter {
override val nameResId: Int = R.string.unit_area
override val imageResId: Int = R.drawable.ic_box_vector
sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) {
data object SquareKilometer : Unit(

View File

@@ -10,6 +10,7 @@ interface Converter {
}
val nameResId: Int
val imageResId: Int
val units: List<Unit>
val defaultTopUnit: Unit
val defaultBottomUnit: Unit

View File

@@ -3,8 +3,8 @@ package com.simplemobiletools.calculator.helpers.converters
import com.simplemobiletools.calculator.R
object LengthConverter : Converter {
override val nameResId: Int = R.string.unit_length
override val imageResId: Int = R.drawable.ic_height_vector
sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) {
data object Kilometer : Unit(

View File

@@ -4,6 +4,7 @@ import com.simplemobiletools.calculator.R
object VolumeConverter : Converter {
override val nameResId: Int = R.string.unit_volume
override val imageResId: Int = R.drawable.ic_drop_vector
sealed class Unit(nameResId: Int, factor: Double) : Converter.Unit(nameResId, factor) {
data object SquareKilometer : Unit(

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2c-5.33,4.55 -8,8.48 -8,11.8c0,4.98 3.8,8.2 8,8.2s8,-3.22 8,-8.2C20,10.48 17.33,6.55 12,2zM7.83,14c0.37,0 0.67,0.26 0.74,0.62c0.41,2.22 2.28,2.98 3.64,2.87c0.43,-0.02 0.79,0.32 0.79,0.75c0,0.4 -0.32,0.73 -0.72,0.75c-2.13,0.13 -4.62,-1.09 -5.19,-4.12C7.01,14.42 7.37,14 7.83,14z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M13,6.99l3,0l-4,-3.99l-4,3.99l3,0l0,10.02l-3,0l4,3.99l4,-3.99l-3,0z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15,13V5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v8c-1.21,0.91 -2,2.37 -2,4c0,2.76 2.24,5 5,5s5,-2.24 5,-5C17,15.37 16.21,13.91 15,13zM11,11V5c0,-0.55 0.45,-1 1,-1s1,0.45 1,1v1h-1v1h1v1v1h-1v1h1v1H11z"/>
</vector>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#22ffffff">
<item android:id="@+id/clipboard_background_holder">
<layer-list>
<item android:id="@+id/clipboard_background_shape">
<shape android:shape="rectangle">
<corners android:radius="@dimen/medium_margin" />
<solid android:color="@color/md_grey_800" />
</shape>
</item>
<item android:id="@+id/clipboard_background_stroke">
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<stroke
android:width="1dp"
android:color="@color/md_grey_600" />
<corners android:radius="@dimen/medium_margin" />
</shape>
</item>
</layer-list>
</item>
</ripple>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/unit_converter_picker_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.simplemobiletools.calculator.activities.UnitConverterActivity"
tools:ignore="HardcodedText">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/unit_converter_picker_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/color_primary"
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/unit_types_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
tools:itemCount="20"
tools:listitem="@layout/item_unit_type"
app:spanCount="4" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/unit_type_size"
android:layout_height="@dimen/unit_type_size"
xmlns:tools="http://schemas.android.com/tools"
android:layout_margin="@dimen/small_margin"
android:background="@drawable/unit_type_background"
android:padding="@dimen/normal_margin"
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/unit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:src="@drawable/ic_thermostat_vector"
android:layout_gravity="center"
android:padding="@dimen/normal_margin"
android:importantForAccessibility="no"
tools:tint="@color/color_primary" />
<TextView
android:id="@+id/unit_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="Temperature" />
</LinearLayout>

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/converter_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -10,11 +9,6 @@
android:orientation="vertical"
tools:ignore="HardcodedText">
<com.google.android.material.tabs.TabLayout
android:id="@+id/units_tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include
android:id="@+id/view_converter"
layout="@layout/view_converter"

View File

@@ -8,4 +8,6 @@
<dimen name="button_text_size">34sp</dimen>
<dimen name="formula_text_size">20sp</dimen>
<dimen name="display_text_size">40sp</dimen>
<dimen name="unit_type_size">128dp</dimen>
</resources>