Skip to content

Instantly share code, notes, and snippets.

@GigaOrts
Created May 6, 2024 17:20
Show Gist options
  • Save GigaOrts/3d8a8f6d70422f717825ac3740468e32 to your computer and use it in GitHub Desktop.
Save GigaOrts/3d8a8f6d70422f717825ac3740468e32 to your computer and use it in GitHub Desktop.
package com.example.calculator;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.calculator.databinding.FragmentCalculatorBinding;
public class CalculatorFragment extends Fragment {
private FragmentCalculatorBinding binding;
private CalculatorViewModel viewModel;
public CalculatorFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = FragmentCalculatorBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(requireActivity()).get(CalculatorViewModel.class);
viewModel.getInput().observe(requireActivity(), input -> {
binding.outlinedTextView.setText(input);
});
binding.zeroBtn.setOnClickListener(v -> viewModel.setInput("0"));
binding.oneBtn.setOnClickListener(v -> viewModel.setInput("1"));
binding.twoBtn.setOnClickListener(v -> viewModel.setInput("2"));
binding.threeBtn.setOnClickListener(v -> viewModel.setInput("3"));
binding.fourBtn.setOnClickListener(v -> viewModel.setInput("4"));
binding.fiveBtn.setOnClickListener(v -> viewModel.setInput("5"));
binding.sixBtn.setOnClickListener(v -> viewModel.setInput("6"));
binding.sevenBtn.setOnClickListener(v -> viewModel.setInput("7"));
binding.eightBtn.setOnClickListener(v -> viewModel.setInput("8"));
binding.nineBtn.setOnClickListener(v -> viewModel.setInput("9"));
binding.plusBtn.setOnClickListener(v -> viewModel.setInput("+"));
binding.minusBtn.setOnClickListener(v -> viewModel.setInput("-"));
binding.multiplicationBtn.setOnClickListener(v -> viewModel.setInput("*"));
binding.divisionBtn.setOnClickListener(v -> viewModel.setInput("/"));
binding.pointBtn.setOnClickListener(v -> viewModel.setInput("."));
binding.clearBtn.setOnClickListener(v -> viewModel.setInput("C"));
binding.backspaceBtn.setOnClickListener(v -> viewModel.setInput("B"));
binding.equalBtn.setOnClickListener(v -> viewModel.setInput("="));
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
package com.example.calculator;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
public class CalculatorViewModel extends ViewModel {
private String localVariable;
private String localVariableToScreen;
private final MutableLiveData<String> input = new MutableLiveData<>();
public LiveData<String> getInput() {
return input;
}
private final ArrayList<Double> doublesSecondLine = new ArrayList<>();
public void setInput(String text) {
if (text.equals("=")) {
if (localVariableToScreen == null) {
localVariableToScreen = "0";
localVariable = "0";
} else if (localVariableToScreen.endsWith("+") || localVariableToScreen.endsWith("-") ||
localVariableToScreen.endsWith("*") || localVariableToScreen.endsWith("/") ||
localVariableToScreen.endsWith(".")) {
localVariableToScreen = localVariableToScreen.substring(0,
localVariableToScreen.length() - 1);
localVariable = localVariableToScreen;
} else if (localVariableToScreen.isEmpty()) {
localVariableToScreen = "0";
localVariable = "0";
}
calculateEquation(localVariableToScreen);
} else if (text.equals("C")) {
localVariableToScreen = "";
localVariable = "";
showResultOnScreen();
} else if (text.equals("B")) {
if (localVariableToScreen != null) {
if (!localVariableToScreen.isEmpty()) {
localVariableToScreen = localVariableToScreen.substring(0,
localVariableToScreen.length() - 1);
localVariable = localVariableToScreen;
}
}
showResultOnScreen();
} else {
showEquationOnScreen(text);
}
}
private void showResultOnScreen() {
input.setValue(localVariableToScreen);
}
private void showEquationOnScreen(String text) {
if (localVariableToScreen == null) {
if (!text.equals(".") && !text.equals("=") && !text.equals("+") &&
!text.equals("*") && !text.equals("/")) {
localVariableToScreen = text;
localVariable = text;
}
} else {
if (localVariableToScreen.equals("Infinity")) {
localVariableToScreen = "";
localVariable = "";
}
if (text.equals("+") || text.equals("-") || text.equals("*") || text.equals("/")) {
if (localVariableToScreen.endsWith("+") || localVariableToScreen.endsWith("-") ||
localVariableToScreen.endsWith("*") || localVariableToScreen.endsWith("/") ||
localVariableToScreen.endsWith(".")) {
localVariableToScreen = localVariableToScreen.substring(0,
localVariableToScreen.length() - 1);
} else if (localVariableToScreen.endsWith("0") && localVariable.contains(".")) {
localVariableToScreen = localVariableToScreen
.replaceAll("0*$", "").replaceAll("\\.$", "");
}
localVariableToScreen = localVariableToScreen + text;
localVariable = "";
} else if (text.equals(".")) {
if (!localVariable.isEmpty() && !localVariable.contains(".")) {
localVariableToScreen = localVariableToScreen + text;
localVariable = localVariable + text;
}
} else {
if (localVariableToScreen.endsWith("0") && localVariableToScreen.length() == 1) {
localVariableToScreen = text;
localVariable = text;
} else {
localVariableToScreen = localVariableToScreen + text;
localVariable = localVariable + text;
}
}
}
showResultOnScreen();
}
private void calculateEquation(String inputEquation) {
final ArrayList<String> multDivVarStringsArray = new ArrayList<>();
final ArrayList<String> addSubtVarStringsArray = new ArrayList<>();
String[] splittedString = inputEquation.split("(?=[+-])(?<=[0-9])");
for (int i = 0; i < splittedString.length; i++) {
String item = splittedString[i];
if (item.contains("*") || item.contains("/")) {
multDivVarStringsArray.add(item);
} else {
addSubtVarStringsArray.add(item);
}
}
if (!multDivVarStringsArray.isEmpty()) {
for (int i = 0; i < multDivVarStringsArray.size(); i++) {
final ArrayList<Double> doublesFirstLine = new ArrayList<>();
final ArrayList<Character> operatorsMulDiv = new ArrayList<>();
String multDivVarString = multDivVarStringsArray.get(i);
String[] splittedMultDivVars = multDivVarString.split("(?=[*/])(?<=[0-9])");
for (int j = 0; j < splittedMultDivVars.length; j++) {
String item = splittedMultDivVars[j];
if (item.startsWith("*")) {
operatorsMulDiv.add('*');
item = item.substring(1);
} else if (item.startsWith("/")) {
operatorsMulDiv.add('/');
item = item.substring(1);
}
Double doubleItem = Double.parseDouble(item);
doublesFirstLine.add(doubleItem);
}
Double secondLineVariable = doublesFirstLine.get(0);
for (int j = 0; j < operatorsMulDiv.size(); j++) {
if (operatorsMulDiv.get(j) == '*') {
secondLineVariable = secondLineVariable * doublesFirstLine.get(j + 1);
} else if (operatorsMulDiv.get(j) == '/') {
secondLineVariable = secondLineVariable / doublesFirstLine.get(j + 1);
}
}
doublesSecondLine.add(secondLineVariable);
}
if (!addSubtVarStringsArray.isEmpty()) {
for (int i = 0; i < addSubtVarStringsArray.size(); i++) {
if (addSubtVarStringsArray.get(i).startsWith("+")) {
String subStringVar = addSubtVarStringsArray.get(i).substring(1);
Double doubleVariable = Double.parseDouble(subStringVar);
doublesSecondLine.add(doubleVariable);
} else {
Double doubleVariable = Double.parseDouble(addSubtVarStringsArray.get(i));
doublesSecondLine.add(doubleVariable);
}
}
}
calculateSecondLineDoubles();
} else if (!addSubtVarStringsArray.isEmpty()) {
for (int i = 0; i < addSubtVarStringsArray.size(); i++) {
if (addSubtVarStringsArray.get(i).startsWith("+")) {
String subStringVar = addSubtVarStringsArray.get(i).substring(1);
Double doubleVariable = Double.parseDouble(subStringVar);
doublesSecondLine.add(doubleVariable);
} else {
Double doubleVariable = Double.parseDouble(addSubtVarStringsArray.get(i));
doublesSecondLine.add(doubleVariable);
}
}
calculateSecondLineDoubles();
}
}
private void calculateSecondLineDoubles() {
Double outputResult = 0d;
if (doublesSecondLine.size() > 1) {
for (int i = 0; i < doublesSecondLine.size(); i++) {
outputResult = outputResult + doublesSecondLine.get(i);
}
} else {
outputResult = doublesSecondLine.get(0);
}
localVariableToScreen = outputResult.toString();
localVariable = outputResult.toString();
if (localVariableToScreen.endsWith("0") && localVariable.contains(".")) {
localVariableToScreen = localVariableToScreen
.replaceAll("0*$", "").replaceAll("\\.$", "");
localVariable = localVariableToScreen;
}
showResultOnScreen();
doublesSecondLine.clear();
}
}
package com.example.calculator;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentContainerView;
import androidx.fragment.app.FragmentManager;
import com.example.calculator.databinding.ActivityMainBinding;
import com.example.calculator.databinding.FragmentCalculatorBinding;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(binding.fragmentContainer.getId(), CalculatorFragment.class, null)
.commitNow();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment