Skip to content

Commit 8e48e02

Browse files
committed
Merge branch 'add-error-messages'
2 parents 7908f84 + a89f166 commit 8e48e02

File tree

4 files changed

+153
-30
lines changed

4 files changed

+153
-30
lines changed

app/src/main/java/com/example/kalkulator/activities/AdvancedCalculatorActivity.java

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.os.Vibrator;
66
import android.view.View;
77
import android.widget.Button;
8+
import android.widget.Toast;
89
import androidx.appcompat.app.AppCompatActivity;
910
import com.example.kalkulator.R;
1011
import com.example.kalkulator.listeners.DigitOnClickListener;
@@ -27,6 +28,7 @@ protected void onCreate(Bundle savedInstanceState)
2728
super.onCreate(savedInstanceState);
2829
setContentView(R.layout.activity_advanced_calculator);
2930

31+
CalculatorHandler.setContextForToastMessages(this);
3032
CalculatorHandler.setVibrator((Vibrator) getSystemService(Context.VIBRATOR_SERVICE));
3133
CalculatorHandler.setValueTextView(findViewById(R.id.value_text_view));
3234
CalculatorHandler.setOperationTextView(findViewById(R.id.operation_text_view));
@@ -125,11 +127,20 @@ public void percentOnClick(View v)
125127

126128
double result = OperationOnClickListener.calculate(prevValue, currValue);
127129

128-
prevValueTextView.setText("");
129-
operationTextView.setText("");
130-
valueTextView.setText(DECIMAL_FORMAT.format(result).replace('.', ','));
130+
String formattedOutput = DECIMAL_FORMAT.format(result).replace('.', ',');
131+
132+
if (formattedOutput.equals(INFINITY_SYMBOL) || formattedOutput.equals(MINUS_NAN) || formattedOutput.equals(NAN))
133+
{
134+
Toast.makeText(this, "Cannot divide by 0", Toast.LENGTH_SHORT).show();
135+
}
136+
else if (!isOutputTooLong(formattedOutput))
137+
{
138+
prevValueTextView.setText("");
139+
operationTextView.setText("");
140+
valueTextView.setText(formattedOutput);
131141

132-
newValueFlag = true;
142+
newValueFlag = true;
143+
}
133144
}
134145

135146
makeStandardVibration();
@@ -141,9 +152,16 @@ private void logOnClick(View view)
141152

142153
Double currValue = Double.parseDouble(valueText.replace(',', '.'));
143154

144-
currValue = Math.log10(currValue);
155+
if (currValue > 0.0D)
156+
{
157+
currValue = Math.log10(currValue);
145158

146-
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
159+
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
160+
}
161+
else
162+
{
163+
Toast.makeText(this, "The number must not be negative", Toast.LENGTH_SHORT).show();
164+
}
147165

148166
makeStandardVibration();
149167
}
@@ -154,9 +172,16 @@ private void sqrtOnClick(View view)
154172

155173
Double currValue = Double.parseDouble(valueText.replace(',', '.'));
156174

157-
currValue = Math.sqrt(currValue);
175+
if (currValue >= 0.0D)
176+
{
177+
currValue = Math.sqrt(currValue);
158178

159-
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
179+
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
180+
}
181+
else
182+
{
183+
Toast.makeText(this, "The number must not be negative", Toast.LENGTH_SHORT).show();
184+
}
160185

161186
makeStandardVibration();
162187
}
@@ -167,9 +192,16 @@ private void lnOnClick(View view)
167192

168193
Double currValue = Double.parseDouble(valueText.replace(',', '.'));
169194

170-
currValue = Math.log(currValue);
195+
if (currValue > 0.0D)
196+
{
197+
currValue = Math.log(currValue);
171198

172-
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
199+
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
200+
}
201+
else
202+
{
203+
Toast.makeText(this, "The number must not be negative", Toast.LENGTH_SHORT).show();
204+
}
173205

174206
makeStandardVibration();
175207
}
@@ -205,10 +237,25 @@ private void tanOnClick(View view)
205237
String valueText = valueTextView.getText().toString();
206238

207239
Double currValue = Double.parseDouble(valueText.replace(',', '.'));
240+
double delta = 1E-3;
208241

209-
currValue = Math.tan(currValue);
242+
// find k
243+
int k = (int) Math.round((currValue - Math.PI / 2) / Math.PI);
210244

211-
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
245+
// calculate the difference
246+
double diff = Math.abs(currValue - (Math.PI / 2 + k * Math.PI));
247+
248+
// check if the input is very close to PI/2 + kPI
249+
if (diff < delta)
250+
{
251+
Toast.makeText(this, "The input is very close or equal to PI/2 + kPI, so the result does not exist", Toast.LENGTH_LONG).show();
252+
}
253+
else
254+
{
255+
currValue = Math.tan(currValue);
256+
257+
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
258+
}
212259

213260
makeStandardVibration();
214261
}
@@ -221,7 +268,12 @@ private void xSquaredOnClick(View view)
221268

222269
currValue = Math.pow(currValue, 2.0);
223270

224-
valueTextView.setText(DECIMAL_FORMAT.format(currValue).replace('.', ','));
271+
String formattedOutput = DECIMAL_FORMAT.format(currValue).replace('.', ',');
272+
273+
if (!isOutputTooLong(formattedOutput))
274+
{
275+
valueTextView.setText(formattedOutput);
276+
}
225277

226278
makeStandardVibration();
227279
}
@@ -279,11 +331,20 @@ public void equalsOnClick(View v)
279331

280332
double result = OperationOnClickListener.calculate(prevValue, currValue);
281333

282-
prevValueTextView.setText("");
283-
operationTextView.setText("");
284-
valueTextView.setText(DECIMAL_FORMAT.format(result).replace('.', ','));
334+
String formattedOutput = DECIMAL_FORMAT.format(result).replace('.', ',');
335+
336+
if (formattedOutput.equals(INFINITY_SYMBOL))
337+
{
338+
Toast.makeText(this, "Cannot divide by 0", Toast.LENGTH_SHORT).show();
339+
}
340+
else if (!isOutputTooLong(formattedOutput))
341+
{
342+
prevValueTextView.setText("");
343+
operationTextView.setText("");
344+
valueTextView.setText(formattedOutput);
285345

286-
newValueFlag = true;
346+
newValueFlag = true;
347+
}
287348
}
288349

289350
makeStandardVibration();

app/src/main/java/com/example/kalkulator/activities/SimpleCalculatorActivity.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.os.Vibrator;
66
import android.view.View;
77
import android.widget.Button;
8+
import android.widget.Toast;
89
import androidx.appcompat.app.AppCompatActivity;
910
import com.example.kalkulator.R;
1011
import com.example.kalkulator.listeners.DigitOnClickListener;
@@ -25,6 +26,7 @@ protected void onCreate(Bundle savedInstanceState)
2526
super.onCreate(savedInstanceState);
2627
setContentView(R.layout.activity_simple_calculator);
2728

29+
CalculatorHandler.setContextForToastMessages(this);
2830
CalculatorHandler.setVibrator((Vibrator) getSystemService(Context.VIBRATOR_SERVICE));
2931
CalculatorHandler.setValueTextView(findViewById(R.id.value_text_view));
3032
CalculatorHandler.setOperationTextView(findViewById(R.id.operation_text_view));
@@ -145,11 +147,20 @@ public void equalsOnClick(View v)
145147

146148
double result = OperationOnClickListener.calculate(prevValue, currValue);
147149

148-
prevValueTextView.setText("");
149-
operationTextView.setText("");
150-
valueTextView.setText(DECIMAL_FORMAT.format(result).replace('.', ','));
150+
String formattedOutput = DECIMAL_FORMAT.format(result).replace('.', ',');
151+
152+
if (formattedOutput.equals(INFINITY_SYMBOL) || formattedOutput.equals(MINUS_NAN) || formattedOutput.equals(NAN))
153+
{
154+
Toast.makeText(this, "Cannot divide by 0", Toast.LENGTH_SHORT).show();
155+
}
156+
else if (!isOutputTooLong(formattedOutput))
157+
{
158+
prevValueTextView.setText("");
159+
operationTextView.setText("");
160+
valueTextView.setText(formattedOutput);
151161

152-
newValueFlag = true;
162+
newValueFlag = true;
163+
}
153164
}
154165

155166
makeStandardVibration();

app/src/main/java/com/example/kalkulator/listeners/OperationOnClickListener.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.example.kalkulator.listeners;
22

33
import android.view.View;
4+
import android.widget.Toast;
5+
import com.example.kalkulator.utils.CalculatorHandler;
46

57
import static com.example.kalkulator.utils.CalculatorHandler.*;
68

@@ -16,31 +18,42 @@ public OperationOnClickListener(char operation)
1618
@Override
1719
public void onClick(View v)
1820
{
21+
String formattedOutput;
1922
double result;
2023
double prevValue;
2124
double currValue = Double.parseDouble(valueTextView.getText().toString().replace(',', '.'));
25+
boolean outputTooLong;
26+
boolean operationChange = true;
2227

2328
if (operationTextView.getText().toString().isEmpty())
2429
{
2530
prevValueTextView.setText(valueTextView.getText());
2631
}
27-
else if (prevValueTextView.getText().toString().isEmpty())
28-
{
29-
result = calculate(0, currValue);
30-
31-
prevValueTextView.setText(DECIMAL_FORMAT.format(result).replace('.', ','));
32-
}
3332
else
3433
{
3534
prevValue = Double.parseDouble(prevValueTextView.getText().toString().replace(',', '.'));
3635

3736
result = calculate(prevValue, currValue);
3837

39-
prevValueTextView.setText(DECIMAL_FORMAT.format(result).replace('.', ','));
38+
formattedOutput = DECIMAL_FORMAT.format(result).replace('.', ',');
39+
outputTooLong = CalculatorHandler.isOutputTooLong(formattedOutput);
40+
41+
if (formattedOutput.equals(INFINITY_SYMBOL) || formattedOutput.equals(MINUS_NAN) || formattedOutput.equals(NAN))
42+
{
43+
Toast.makeText(getToastMessageContext(), "Cannot divide by 0", Toast.LENGTH_SHORT).show();
44+
operationChange = false;
45+
}
46+
else if (!outputTooLong)
47+
{
48+
prevValueTextView.setText(formattedOutput);
49+
}
4050
}
4151

42-
operationTextView.setText(String.valueOf(operation));
43-
newValueFlag = true;
52+
if (operationChange)
53+
{
54+
operationTextView.setText(String.valueOf(operation));
55+
newValueFlag = true;
56+
}
4457

4558
makeStandardVibration();
4659
}

app/src/main/java/com/example/kalkulator/utils/CalculatorHandler.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.example.kalkulator.utils;
22

3+
import android.content.Context;
34
import android.os.VibrationEffect;
45
import android.os.Vibrator;
56
import android.widget.TextView;
7+
import android.widget.Toast;
68

79
import java.text.DecimalFormat;
810

@@ -13,11 +15,16 @@ public class CalculatorHandler
1315
public static final char CHAR_MULTIPLY = '⨯';
1416
public static final char CHAR_DIVIDE = '÷';
1517
public static final char CHAR_POWER = '^';
18+
public static final String INFINITY_SYMBOL = "\u221E"; // infinity symbol (dividing by zero)
19+
public static final String MINUS_NAN = "-NaN";
20+
public static final String NAN = "NaN";
1621
public static final int VALUE_TEXT_VIEW_MAX_SIZE = 10;
22+
public static final int OUTPUT_MAX_SIZE = 20;
1723
public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##########");
1824
public static final int VIBRATION_DURATION_MS = 8;
1925
public static final int VIBRATION_AMPLITUDE = 100;
2026
private static Vibrator vibrator;
27+
private static Context toastMessageContext;
2128

2229
public static TextView valueTextView, operationTextView, prevValueTextView;
2330
public static Boolean newValueFlag;
@@ -51,4 +58,35 @@ public static void makeStandardVibration()
5158
{
5259
vibrator.vibrate(VibrationEffect.createOneShot(VIBRATION_DURATION_MS, VIBRATION_AMPLITUDE));
5360
}
61+
62+
public static void setContextForToastMessages(Context context)
63+
{
64+
CalculatorHandler.toastMessageContext = context;
65+
}
66+
67+
public static boolean isOutputTooLong(String formattedOutput)
68+
{
69+
int digitsInOutput = 0;
70+
boolean outputTooLong = false;
71+
72+
for (char c : formattedOutput.toCharArray())
73+
{
74+
digitsInOutput += Character.isDigit(c) ? 1 : 0;
75+
}
76+
77+
System.out.println("digits in output: " + digitsInOutput);
78+
79+
if (digitsInOutput > OUTPUT_MAX_SIZE)
80+
{
81+
Toast.makeText(toastMessageContext, "The output is too long", Toast.LENGTH_SHORT).show();
82+
outputTooLong = true;
83+
}
84+
85+
return outputTooLong;
86+
}
87+
88+
public static Context getToastMessageContext()
89+
{
90+
return toastMessageContext;
91+
}
5492
}

0 commit comments

Comments
 (0)