diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt index 08850623..cff7c9de 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/activities/MainActivity.kt @@ -29,7 +29,7 @@ class MainActivity : SimpleActivity(), Calculator { private var storedUseCommaAsDecimalMark = false private var decimalSeparator = DOT private var groupingSeparator = COMMA - + private var saveCalculatorState: String = "" private lateinit var calc: CalculatorImpl override fun onCreate(savedInstanceState: Bundle?) { @@ -39,12 +39,14 @@ class MainActivity : SimpleActivity(), Calculator { appLaunched(BuildConfig.APPLICATION_ID) setupOptionsMenu() refreshMenuItems() - updateMaterialActivityViews(main_coordinator, null, useTransparentNavigation = false, useTopSearchMenu = false) 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_minus.setOnClickOperation(MINUS) btn_multiply.setOnClickOperation(MULTIPLY) @@ -53,7 +55,6 @@ class MainActivity : SimpleActivity(), Calculator { btn_power.setOnClickOperation(POWER) btn_root.setOnClickOperation(ROOT) btn_minus.setOnLongClickListener { calc.turnToNegative() } - btn_clear.setVibratingOnClickListener { calc.handleClear() } btn_clear.setOnLongClickListener { calc.handleReset() @@ -69,7 +70,6 @@ class MainActivity : SimpleActivity(), Calculator { btn_equals.setVibratingOnClickListener { calc.handleEquals() } formula.setOnLongClickListener { copyToClipboard(false) } result.setOnLongClickListener { copyToClipboard(true) } - AutofitHelper.create(result) AutofitHelper.create(formula) 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() { main_toolbar.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt index 8f72e4cb..480978ea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/CalculatorImpl.kt @@ -6,16 +6,21 @@ import com.simplemobiletools.calculator.models.History import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.toast import net.objecthunter.exp4j.ExpressionBuilder +import org.json.JSONObject +import org.json.JSONTokener import java.math.BigDecimal class CalculatorImpl( calculator: Calculator, private val context: Context, private var decimalSeparator: String = DOT, - private var groupingSeparator: String = COMMA + private var groupingSeparator: String = COMMA, + calculatorState: String = "" ) { private var callback: Calculator? = calculator - + private var stateInstance = calculatorState + private var currentResult = "0" + private var previousCalculation = "" private var baseValue = 0.0 private var secondValue = 0.0 private var inputDisplayedFormula = "0" @@ -24,13 +29,16 @@ class CalculatorImpl( private val operations = listOf("+", "-", "×", "÷", "^", "%", "√") private val operationsRegex = "[-+×÷^%√]".toPattern() private val numbersRegex = "[^0-9,.]".toRegex() - private val formatter = NumberFormatHelper( decimalSeparator = decimalSeparator, groupingSeparator = groupingSeparator ) init { - showNewResult("0") + if (stateInstance != "") { + setFromSaveInstanceState(stateInstance) + } + showNewResult(currentResult) + showNewFormula(previousCalculation) } private fun addDigit(number: Int) { @@ -198,6 +206,7 @@ class CalculatorImpl( private fun getSecondValue(): Double { val valueToCheck = inputDisplayedFormula.trimStart('-').removeGroupSeparator() + var value = valueToCheck.substring(valueToCheck.indexOfAny(operations) + 1) if (value == "") { value = "0" @@ -318,10 +327,12 @@ class CalculatorImpl( } private fun showNewResult(value: String) { + currentResult = value callback!!.showNewResult(value, context) } private fun showNewFormula(value: String) { + previousCalculation = value callback!!.showNewFormula(value, context) } @@ -421,4 +432,27 @@ class CalculatorImpl( private fun Double.format() = formatter.doubleToString(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) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt index a00ac851..aa4c0362 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calculator/helpers/Constants.kt @@ -30,3 +30,11 @@ const val COMMA = "," // shared prefs 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"