Created
May 6, 2024 17:20
-
-
Save GigaOrts/3d8a8f6d70422f717825ac3740468e32 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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