mirror of
https://github.com/SimpleMobileTools/Simple-Calculator.git
synced 2025-06-05 21:49:13 +02:00
Merge pull request #305 from inepsie/fix_data_lost_during_rotation
Fix data lost during rotation
This commit is contained in:
@ -29,7 +29,7 @@ class MainActivity : SimpleActivity(), Calculator {
|
|||||||
private var storedUseCommaAsDecimalMark = false
|
private var storedUseCommaAsDecimalMark = false
|
||||||
private var decimalSeparator = DOT
|
private var decimalSeparator = DOT
|
||||||
private var groupingSeparator = COMMA
|
private var groupingSeparator = COMMA
|
||||||
|
private var saveCalculatorState: String = ""
|
||||||
private lateinit var calc: CalculatorImpl
|
private lateinit var calc: CalculatorImpl
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -39,12 +39,14 @@ class MainActivity : SimpleActivity(), Calculator {
|
|||||||
appLaunched(BuildConfig.APPLICATION_ID)
|
appLaunched(BuildConfig.APPLICATION_ID)
|
||||||
setupOptionsMenu()
|
setupOptionsMenu()
|
||||||
refreshMenuItems()
|
refreshMenuItems()
|
||||||
|
|
||||||
updateMaterialActivityViews(main_coordinator, null, useTransparentNavigation = false, useTopSearchMenu = false)
|
updateMaterialActivityViews(main_coordinator, null, useTransparentNavigation = false, useTopSearchMenu = false)
|
||||||
setupMaterialScrollListener(main_nested_scrollview, main_toolbar)
|
setupMaterialScrollListener(main_nested_scrollview, main_toolbar)
|
||||||
|
|
||||||
calc = CalculatorImpl(this, applicationContext)
|
if (savedInstanceState != null) {
|
||||||
|
saveCalculatorState = savedInstanceState.getCharSequence(CALCULATOR_STATE) as String
|
||||||
|
}
|
||||||
|
|
||||||
|
calc = CalculatorImpl(this, applicationContext, decimalSeparator, groupingSeparator, saveCalculatorState)
|
||||||
btn_plus.setOnClickOperation(PLUS)
|
btn_plus.setOnClickOperation(PLUS)
|
||||||
btn_minus.setOnClickOperation(MINUS)
|
btn_minus.setOnClickOperation(MINUS)
|
||||||
btn_multiply.setOnClickOperation(MULTIPLY)
|
btn_multiply.setOnClickOperation(MULTIPLY)
|
||||||
@ -53,7 +55,6 @@ class MainActivity : SimpleActivity(), Calculator {
|
|||||||
btn_power.setOnClickOperation(POWER)
|
btn_power.setOnClickOperation(POWER)
|
||||||
btn_root.setOnClickOperation(ROOT)
|
btn_root.setOnClickOperation(ROOT)
|
||||||
btn_minus.setOnLongClickListener { calc.turnToNegative() }
|
btn_minus.setOnLongClickListener { calc.turnToNegative() }
|
||||||
|
|
||||||
btn_clear.setVibratingOnClickListener { calc.handleClear() }
|
btn_clear.setVibratingOnClickListener { calc.handleClear() }
|
||||||
btn_clear.setOnLongClickListener {
|
btn_clear.setOnLongClickListener {
|
||||||
calc.handleReset()
|
calc.handleReset()
|
||||||
@ -69,7 +70,6 @@ class MainActivity : SimpleActivity(), Calculator {
|
|||||||
btn_equals.setVibratingOnClickListener { calc.handleEquals() }
|
btn_equals.setVibratingOnClickListener { calc.handleEquals() }
|
||||||
formula.setOnLongClickListener { copyToClipboard(false) }
|
formula.setOnLongClickListener { copyToClipboard(false) }
|
||||||
result.setOnLongClickListener { copyToClipboard(true) }
|
result.setOnLongClickListener { copyToClipboard(true) }
|
||||||
|
|
||||||
AutofitHelper.create(result)
|
AutofitHelper.create(result)
|
||||||
AutofitHelper.create(formula)
|
AutofitHelper.create(formula)
|
||||||
storeStateVariables()
|
storeStateVariables()
|
||||||
@ -123,6 +123,11 @@ class MainActivity : SimpleActivity(), Calculator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(bundle: Bundle) {
|
||||||
|
super.onSaveInstanceState(bundle)
|
||||||
|
bundle.putString(CALCULATOR_STATE, calc.getCalculatorStateJson().toString())
|
||||||
|
}
|
||||||
|
|
||||||
private fun setupOptionsMenu() {
|
private fun setupOptionsMenu() {
|
||||||
main_toolbar.setOnMenuItemClickListener { menuItem ->
|
main_toolbar.setOnMenuItemClickListener { menuItem ->
|
||||||
when (menuItem.itemId) {
|
when (menuItem.itemId) {
|
||||||
|
@ -6,16 +6,21 @@ import com.simplemobiletools.calculator.models.History
|
|||||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
import com.simplemobiletools.commons.extensions.toast
|
import com.simplemobiletools.commons.extensions.toast
|
||||||
import net.objecthunter.exp4j.ExpressionBuilder
|
import net.objecthunter.exp4j.ExpressionBuilder
|
||||||
|
import org.json.JSONObject
|
||||||
|
import org.json.JSONTokener
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
|
|
||||||
class CalculatorImpl(
|
class CalculatorImpl(
|
||||||
calculator: Calculator,
|
calculator: Calculator,
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private var decimalSeparator: String = DOT,
|
private var decimalSeparator: String = DOT,
|
||||||
private var groupingSeparator: String = COMMA
|
private var groupingSeparator: String = COMMA,
|
||||||
|
calculatorState: String = ""
|
||||||
) {
|
) {
|
||||||
private var callback: Calculator? = calculator
|
private var callback: Calculator? = calculator
|
||||||
|
private var stateInstance = calculatorState
|
||||||
|
private var currentResult = "0"
|
||||||
|
private var previousCalculation = ""
|
||||||
private var baseValue = 0.0
|
private var baseValue = 0.0
|
||||||
private var secondValue = 0.0
|
private var secondValue = 0.0
|
||||||
private var inputDisplayedFormula = "0"
|
private var inputDisplayedFormula = "0"
|
||||||
@ -24,13 +29,16 @@ class CalculatorImpl(
|
|||||||
private val operations = listOf("+", "-", "×", "÷", "^", "%", "√")
|
private val operations = listOf("+", "-", "×", "÷", "^", "%", "√")
|
||||||
private val operationsRegex = "[-+×÷^%√]".toPattern()
|
private val operationsRegex = "[-+×÷^%√]".toPattern()
|
||||||
private val numbersRegex = "[^0-9,.]".toRegex()
|
private val numbersRegex = "[^0-9,.]".toRegex()
|
||||||
|
|
||||||
private val formatter = NumberFormatHelper(
|
private val formatter = NumberFormatHelper(
|
||||||
decimalSeparator = decimalSeparator, groupingSeparator = groupingSeparator
|
decimalSeparator = decimalSeparator, groupingSeparator = groupingSeparator
|
||||||
)
|
)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
showNewResult("0")
|
if (stateInstance != "") {
|
||||||
|
setFromSaveInstanceState(stateInstance)
|
||||||
|
}
|
||||||
|
showNewResult(currentResult)
|
||||||
|
showNewFormula(previousCalculation)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addDigit(number: Int) {
|
private fun addDigit(number: Int) {
|
||||||
@ -198,6 +206,7 @@ class CalculatorImpl(
|
|||||||
|
|
||||||
private fun getSecondValue(): Double {
|
private fun getSecondValue(): Double {
|
||||||
val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator()
|
val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator()
|
||||||
|
|
||||||
var value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1)
|
var value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1)
|
||||||
if (value == "") {
|
if (value == "") {
|
||||||
value = "0"
|
value = "0"
|
||||||
@ -318,10 +327,12 @@ class CalculatorImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun showNewResult(value: String) {
|
private fun showNewResult(value: String) {
|
||||||
|
currentResult = value
|
||||||
callback!!.showNewResult(value, context)
|
callback!!.showNewResult(value, context)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showNewFormula(value: String) {
|
private fun showNewFormula(value: String) {
|
||||||
|
previousCalculation = value
|
||||||
callback!!.showNewFormula(value, context)
|
callback!!.showNewFormula(value, context)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,4 +432,27 @@ class CalculatorImpl(
|
|||||||
private fun Double.format() = formatter.doubleToString(this)
|
private fun Double.format() = formatter.doubleToString(this)
|
||||||
|
|
||||||
private fun String.removeGroupSeparator() = formatter.removeGroupingSeparator(this)
|
private fun String.removeGroupSeparator() = formatter.removeGroupingSeparator(this)
|
||||||
|
|
||||||
|
fun getCalculatorStateJson(): JSONObject {
|
||||||
|
val jsonObj = JSONObject()
|
||||||
|
jsonObj.put(RES, currentResult)
|
||||||
|
jsonObj.put(PREVIOUS_CALCULATION, previousCalculation)
|
||||||
|
jsonObj.put(LAST_KEY, lastKey)
|
||||||
|
jsonObj.put(LAST_OPERATION, lastOperation)
|
||||||
|
jsonObj.put(BASE_VALUE, baseValue)
|
||||||
|
jsonObj.put(SECOND_VALUE, secondValue)
|
||||||
|
jsonObj.put(INPUT_DISPLAYED_FORMULA, inputDisplayedFormula)
|
||||||
|
return jsonObj
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setFromSaveInstanceState(json: String) {
|
||||||
|
val jsonObject = JSONTokener(json).nextValue() as JSONObject
|
||||||
|
currentResult = jsonObject.getString(RES)
|
||||||
|
previousCalculation = jsonObject.getString(PREVIOUS_CALCULATION)
|
||||||
|
lastKey = jsonObject.getString(LAST_KEY)
|
||||||
|
lastOperation = jsonObject.getString(LAST_OPERATION)
|
||||||
|
baseValue = jsonObject.getDouble(BASE_VALUE)
|
||||||
|
secondValue = jsonObject.getDouble(SECOND_VALUE)
|
||||||
|
inputDisplayedFormula = jsonObject.getString(INPUT_DISPLAYED_FORMULA)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,3 +30,11 @@ const val COMMA = ","
|
|||||||
|
|
||||||
// shared prefs
|
// shared prefs
|
||||||
const val USE_COMMA_AS_DECIMAL_MARK = "use_comma_as_decimal_mark"
|
const val USE_COMMA_AS_DECIMAL_MARK = "use_comma_as_decimal_mark"
|
||||||
|
const val RES = "res"
|
||||||
|
const val PREVIOUS_CALCULATION = "previousCalculation"
|
||||||
|
const val LAST_KEY = "lastKey"
|
||||||
|
const val LAST_OPERATION = "lastOperation"
|
||||||
|
const val BASE_VALUE = "baseValue"
|
||||||
|
const val SECOND_VALUE = "secondValue"
|
||||||
|
const val INPUT_DISPLAYED_FORMULA = "inputDisplayedFormula"
|
||||||
|
const val CALCULATOR_STATE = "calculatorState"
|
||||||
|
Reference in New Issue
Block a user