Gitiles

review.gerrithub.io / AospExtended / platform_packages_apps_ExactCalculator / a62314c100d6b711025e6d438631efb047d52657 / . / docs / implementation-overview.html

<!doctype html> | |

<html> | |

<head> | |

<title>Calculator Implementation Overview</title> | |

<meta charset="UTF-8"> | |

</head> | |

<h1>M Calculator Implementation Overview</h1> | |

<p>Although the appearance of the calculator has changed little from Lollipop, and some of the UI | |

code is indeed the same, the rest of the code has changed substantially. Unsurprisingly, | |

<b>Calculator.java</b> implements the main UI. The other major parts of the implementation | |

are:</p> | |

<p><b>CR.java</b> in <b>external/crcalc</b> provides the underlying demand-driven ("constructive | |

real") arithmetic implementation. Numbers are represented primarily as objects with a method that | |

can compute arbitrarily precise approximations. The actual arithmetic performed by these methods | |

is based on Java's <tt>java.util.BigInteger</tt> arithmetic, with appropriate implicit | |

scaling.</p> | |

<p><b>BoundedRational.java</b> is a rational arithmetic package that is used to provide finite | |

exact answers in "easy" cases. It is used primarily to determine when an approximation provided | |

by CR.java is actually exact. This is used in turn both to limit the length of displayed results | |

and scrolling, as well as to identify errors such as division by zero, that would otherwise result | |

in timeouts during computations. It is in some sense not needed to produce correct results, but | |

it significantly improves the usability of the calculator. It is also used for the "display as | |

fraction" option in the overflow menu.</p> | |

<p><b>CalculatorExpr.java</b> implements calculator arithmetic expressions. It supports editing, | |

saving, restoring, and evaluation of expressions. Evaluation produces a constructive real (CR) | |

and possibly a BoundedRational result. Unlike the "arity" library used in earlier versions, the | |

underlying expression is represented as a sequence of "tokens", many of which are represented by | |

Button ids, not as a character string.</p> | |

<p><b>Evaluator.java</b> implements much of the actual calculator logic, particularly background | |

expression evaluation. Expression evaluation here includes both using CalculatorExpr.java to | |

evaluate the expression, and then invoking the resulting CR value to actually produce finite | |

approximations and convert them to decimal. Two types of expression evaluation are supported: | |

(1) Initial evaluation of the expression and producing an initial decimal approximation, and (2) | |

reevaluation to higher precision. (1) is invoked directly from the Calculator UI, while (2) is | |

invoked from the calculator display, commonly in response to scrolling. When the display requests | |

a result, a "result" is immediately returned, though it may contains blank placeholders. The | |

display is then notified when the real result becomes available.</p> | |

<p><b>CalculatorText.java</b> is the TextView subclass used to display the formula.</p> | |

<p><b>CalculatorResult.java</b> is the TextView subclass used to display the result. It handles | |

result formatting, scrolling, etc. After the user hits "=", the CalculatorResult widget moves | |

into the top position, replacing the formula display. Currently it remains in that position until | |

the formula is again modified.</p> | |

</body> | |

</html> | |