This commit is contained in:
_N0x 2021-06-29 21:01:53 +02:00
parent eb6c30f3cd
commit c62b6123d5
3 changed files with 189 additions and 76 deletions

View File

@ -8,79 +8,159 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.BaseObservable; import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable; import androidx.databinding.Bindable;
public class FractionCalculator extends BaseObservable{ import java.security.InvalidParameterException;
public class FractionCalculator extends BaseObservable{
// Debugging stuff
private static final String TAG = FractionCalculator.class.getName(); private static final String TAG = FractionCalculator.class.getName();
private String denomLeft; public enum ARTIH {ADD, SUBTRACT, MULTIPLICATE, DIVIDE};
private String enumLeft; private ARTIH arithMethod;
private String denomRight;
private String enumRight; private String centerSign;
private String denomResult;
private String enumResult; private int denomLeft;
private int enumLeft;
private int denomRight;
private int enumRight;
private int denomResult;
private int enumResult;
public FractionCalculator(){ public FractionCalculator(){
Log.d(TAG, "new FractionCalculator created"); Log.d(TAG, "new FractionCalculator created");
} }
/// #### GETTER AND SETTER #### // Calculate the result
// https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Br%C3%BCche
public void calculateResult(){
if(denomLeft == 0 || denomRight == 0){
Log.e(TAG, "Denominator cannot be 0");
} else {
switch (arithMethod) {
case ADD:
denomResult = getLCM(denomLeft, denomRight);
enumResult = enumLeft * (denomResult / denomLeft) + enumRight * (denomResult / denomRight);
break;
case SUBTRACT:
denomResult = getLCM(denomLeft, denomRight);
enumResult = enumLeft * (denomResult / denomLeft) - enumRight * (denomResult / denomRight);
break;
case MULTIPLICATE:
denomResult = denomLeft * denomRight;
enumResult = enumLeft * enumRight;
break;
case DIVIDE:
enumResult = enumLeft * denomRight;
denomResult = denomLeft * enumRight;
break;
}
// update the result variables
notifyPropertyChanged(BR.denomResult);
notifyPropertyChanged(BR.enumResult);
}
}
// ####### HELPER METHODS #######
// calculate greatest common divisor (Euclidean algorithm)
private int getGCD(int a, int b){
if(b==0){
return a;
} else {
return getGCD(b,a % b);
}
}
// calculate least common multiple
private int getLCM(int a, int b){
return (a*b)/getGCD(a,b);
}
// ####### END HELPER METHODS #######
/// ####### GETTER AND SETTER #######
public void setArithMethod(ARTIH arithMethod) {
this.arithMethod = arithMethod;
switch(arithMethod){
case ADD:
centerSign = "+";
break;
case SUBTRACT:
centerSign = "-";
break;
case MULTIPLICATE:
centerSign = "*";
break;
case DIVIDE:
centerSign = "/";
break;
}
// Update the sign in the middle of the screen
notifyPropertyChanged(BR.centerSign);
}
@Bindable @Bindable
public String getDenomLeft() { public int getDenomLeft() {
return denomLeft; return denomLeft;
} }
public void setDenomLeft(String denomLeft) { public void setDenomLeft(int denomLeft) {
this.denomLeft = denomLeft; this.denomLeft = denomLeft;
notifyPropertyChanged(BR.denomLeft); notifyPropertyChanged(BR.denomLeft);
} }
@Bindable @Bindable
public String getEnumLeft() { public int getEnumLeft() {
return enumLeft; return enumLeft;
} }
public void setEnumLeft(String enumLeft) { public void setEnumLeft(int enumLeft) {
this.enumLeft = enumLeft; this.enumLeft = enumLeft;
notifyPropertyChanged(BR.enumLeft); notifyPropertyChanged(BR.enumLeft);
} }
@Bindable @Bindable
public String getDenomRight() { public int getDenomRight() {
return denomRight; return denomRight;
} }
public void setDenomRight(String denomRight) { public void setDenomRight(int denomRight) {
this.denomRight = denomRight; this.denomRight = denomRight;
notifyPropertyChanged(BR.denomRight); notifyPropertyChanged(BR.denomRight);
} }
@Bindable @Bindable
public String getEnumRight() { public int getEnumRight() {
return enumRight; return enumRight;
} }
public void setEnumRight(String enumRight) { public void setEnumRight(int enumRight) {
this.enumRight = enumRight; this.enumRight = enumRight;
notifyPropertyChanged(BR.enumRight); notifyPropertyChanged(BR.enumRight);
} }
@Bindable @Bindable
public String getDenomResult() { public int getDenomResult() {
return denomResult; return denomResult;
} }
public void setDenomResult(String denomResult) { public void setDenomResult(int denomResult) {
this.denomResult = denomResult; this.denomResult = denomResult;
notifyPropertyChanged(BR.denomResult); notifyPropertyChanged(BR.denomResult);
} }
@Bindable @Bindable
public String getEnumResult() { public int getEnumResult() {
return enumResult; return enumResult;
} }
public void setEnumResult(String enumResult) { public void setEnumResult(int enumResult) {
this.enumResult = enumResult; this.enumResult = enumResult;
notifyPropertyChanged(BR.enumResult); notifyPropertyChanged(BR.enumResult);
} }
@Bindable
public String getCenterSign() {
return centerSign;
}
/// ####### END GETTER AND SETTER #######
} }

View File

@ -1,5 +1,6 @@
package io.n0x.android.java_mot_testing; package io.n0x.android.java_mot_testing;
import android.annotation.SuppressLint;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@ -16,6 +17,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
// Local calculator instance // Local calculator instance
private FractionCalculator calc; private FractionCalculator calc;
private int test;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -23,8 +26,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
calc = new FractionCalculator(); calc = new FractionCalculator();
// set a value for testing // set a value for testing
calc.setEnumResult("0"); calc.setEnumResult(0);
calc.setDenomResult("0"); calc.setDenomResult(0);
// Bind instance of FractionCalculator to view // Bind instance of FractionCalculator to view
Ex9DataBindingBinding binding = DataBindingUtil.setContentView(this, R.layout.ex9_data_binding); Ex9DataBindingBinding binding = DataBindingUtil.setContentView(this, R.layout.ex9_data_binding);
@ -32,21 +35,34 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
// Button Listeners // Button Listeners
findViewById(R.id.button_add).setOnClickListener(this); findViewById(R.id.button_add).setOnClickListener(this);
findViewById(R.id.button_sub).setOnClickListener(this);
findViewById(R.id.button_mult).setOnClickListener(this);
findViewById(R.id.button_div).setOnClickListener(this);
findViewById(R.id.button_calc).setOnClickListener(this);
// Log create action // Log create action
Log.d(TAG, "MainActivity started"); Log.d(TAG, "MainActivity started");
} }
@SuppressLint("NonConstantResourceId")
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v.getId() == R.id.button_add) { switch(v.getId()){
case R.id.button_add:
// works (without using bindings) calc.setArithMethod(FractionCalculator.ARTIH.ADD);
TextView textView = findViewById(R.id.txt_enum_result); break;
textView.setText("1234"); case R.id.button_sub:
calc.setArithMethod(FractionCalculator.ARTIH.SUBTRACT);
// work with DataBinding break;
calc.setDenomLeft("123123123"); case R.id.button_mult:
calc.setArithMethod(FractionCalculator.ARTIH.MULTIPLICATE);
break;
case R.id.button_div:
calc.setArithMethod(FractionCalculator.ARTIH.DIVIDE);
break;
case R.id.button_calc:
calc.calculateResult();
break;
} }
} }
} }

View File

@ -15,131 +15,148 @@
<Button <Button
android:id="@+id/button_add" android:id="@+id/button_add"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="152dp"
android:layout_marginEnd="8dp"
android:text="+" android:text="+"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/button_sub"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<Button <Button
android:id="@+id/button_sub" android:id="@+id/button_sub"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="152dp"
android:layout_marginEnd="8dp"
android:text="-" android:text="-"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/button_mult"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@+id/button_add" />
<Button <Button
android:id="@+id/button_mult" android:id="@+id/button_mult"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="152dp"
android:layout_marginEnd="8dp"
android:text="*" android:text="*"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toStartOf="@+id/button_div"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@+id/button_sub" />
<Button <Button
android:id="@+id/button_div" android:id="@+id/button_div"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="152dp"
android:layout_marginEnd="8dp"
android:text="/" android:text="/"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.501" app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_mult" />
<TextView
android:id="@+id/txt_equals"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:text="="
android:textSize="34sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.181"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_div" />
<TextView <TextView
android:id="@+id/txt_enum_result" android:id="@+id/txt_enum_result"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="64dp" android:layout_marginTop="16dp"
android:text="@{calc.enumResult}" android:text="@{String.valueOf(calc.enumResult)}"
android:textAlignment="center" android:textAlignment="center"
android:textSize="34sp" android:textSize="34sp"
app:layout_constraintBottom_toTopOf="@+id/txt_denom_result"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_div" /> app:layout_constraintTop_toBottomOf="@+id/button_mult" />
<TextView <TextView
android:id="@+id/txt_denom_result" android:id="@+id/txt_denom_result"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="3dp" android:text="@{String.valueOf(calc.denomResult)}"
android:layout_marginBottom="412dp"
android:text="@{calc.denomResult}"
android:textAlignment="center" android:textAlignment="center"
android:textSize="34sp" android:textSize="34sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.501"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txt_enum_result" /> app:layout_constraintTop_toBottomOf="@+id/txt_enum_result" />
<EditText <EditText
android:text="@{calc.enumRight}"
android:id="@+id/enumRight" android:id="@+id/enumRight"
android:layout_width="140dp" android:layout_width="140dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginTop="32dp" android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:ems="10" android:ems="10"
android:gravity="center_horizontal"
android:hint="Zähler" android:hint="Zähler"
android:inputType="numberSigned" android:inputType="numberSigned"
android:text="@={`` + calc.enumRight}"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button_add"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<EditText <EditText
android:text="@{calc.enumRight}"
android:id="@+id/enumLeft" android:id="@+id/enumLeft"
android:layout_width="140dp" android:layout_width="140dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginTop="32dp" android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:ems="10" android:ems="10"
android:gravity="center_horizontal"
android:hint="Zähler" android:hint="Zähler"
android:inputType="numberSigned" android:inputType="numberSigned"
app:layout_constraintEnd_toStartOf="@+id/button_add" android:text="@={`` + calc.enumLeft}"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<EditText <EditText
android:text="@{calc.denomLeft}"
android:id="@+id/denomLeft" android:id="@+id/denomLeft"
android:layout_width="140dp" android:layout_width="140dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginTop="32dp" android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:ems="10" android:ems="10"
android:gravity="center_horizontal"
android:hint="Nenner" android:hint="Nenner"
android:inputType="number" android:inputType="number"
app:layout_constraintEnd_toStartOf="@+id/button_mult" android:text="@={`` + calc.denomLeft}"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/enumLeft" /> app:layout_constraintTop_toBottomOf="@+id/enumLeft" />
<EditText <EditText
android:text="@{calc.denomRight}"
android:id="@+id/denomRight" android:id="@+id/denomRight"
android:layout_width="140dp" android:layout_width="140dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginTop="32dp" android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:ems="10" android:ems="10"
android:gravity="center_horizontal"
android:hint="Nenner" android:hint="Nenner"
android:inputType="number" android:inputType="number"
android:text="@={`` + calc.denomRight}"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button_mult"
app:layout_constraintTop_toBottomOf="@+id/enumRight" /> app:layout_constraintTop_toBottomOf="@+id/enumRight" />
<Button
android:id="@+id/button_calc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="236dp"
android:text="="
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/centerSign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{calc.centerSign}"
android:textAlignment="center"
android:textSize="60sp"
app:layout_constraintBottom_toTopOf="@+id/button_mult"
app:layout_constraintEnd_toStartOf="@+id/enumRight"
app:layout_constraintStart_toEndOf="@+id/enumLeft"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</layout> </layout>