mirror of
https://github.com/SimpleMobileTools/Simple-Calculator.git
synced 2025-06-05 21:49:13 +02:00
Add picker for unit types for conversion
This commit is contained in:
@@ -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"
|
||||
|
@@ -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() {
|
||||
|
@@ -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()) }
|
||||
}
|
||||
binding.viewUnitConverter.converterHolder.let { updateViewColors(it, getProperTextColor()) }
|
||||
|
||||
if (config.preventPhoneFromSleeping) {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
if (storedUseCommaAsDecimalMark != config.useCommaAsDecimalMark) {
|
||||
setupDecimalSeparator()
|
||||
}
|
||||
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 {
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
@@ -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(
|
||||
|
@@ -10,6 +10,7 @@ interface Converter {
|
||||
}
|
||||
|
||||
val nameResId: Int
|
||||
val imageResId: Int
|
||||
val units: List<Unit>
|
||||
val defaultTopUnit: Unit
|
||||
val defaultBottomUnit: Unit
|
||||
|
@@ -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(
|
||||
|
@@ -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(
|
||||
|
5
app/src/main/res/drawable/ic_box_vector.xml
Normal file
5
app/src/main/res/drawable/ic_box_vector.xml
Normal 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>
|
5
app/src/main/res/drawable/ic_drop_vector.xml
Normal file
5
app/src/main/res/drawable/ic_drop_vector.xml
Normal 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>
|
5
app/src/main/res/drawable/ic_height_vector.xml
Normal file
5
app/src/main/res/drawable/ic_height_vector.xml
Normal 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>
|
5
app/src/main/res/drawable/ic_thermostat_vector.xml
Normal file
5
app/src/main/res/drawable/ic_thermostat_vector.xml
Normal 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>
|
23
app/src/main/res/drawable/unit_type_background.xml
Normal file
23
app/src/main/res/drawable/unit_type_background.xml
Normal 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>
|
29
app/src/main/res/layout/activity_unit_converter_picker.xml
Normal file
29
app/src/main/res/layout/activity_unit_converter_picker.xml
Normal 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>
|
30
app/src/main/res/layout/item_unit_type.xml
Normal file
30
app/src/main/res/layout/item_unit_type.xml
Normal 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>
|
@@ -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"
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user