Commit 44c3082d authored by Gamage B.G.N.U's avatar Gamage B.G.N.U

Merge branch 'IT17009546' into 'master'

Created  the input method for probability distribution

See merge request !63
parents 073c54b6 b6c9bc8d
package com.elearning.probabilityandstatisticsanalyserandeducator.inputMethod;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import com.chaquo.python.Python;
import com.chaquo.python.android.AndroidPlatform;
import com.elearning.probabilityandstatisticsanalyserandeducator.MainActivity;
import com.elearning.probabilityandstatisticsanalyserandeducator.R;
import com.elearning.probabilityandstatisticsanalyserandeducator.calculationfunction.DescriptiveStatisticsCalcuation;
import com.elearning.probabilityandstatisticsanalyserandeducator.dataExtraction.DescriptiveStatisticsCSVfile;
import com.elearning.probabilityandstatisticsanalyserandeducator.dataExtraction.DescriptiveStatisticsQuestionComparation;
import com.elearning.probabilityandstatisticsanalyserandeducator.dataExtraction.ExtractData;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.googlecode.tesseract.android.TessBaseAPI;
import com.theartofdev.edmodo.cropper.CropImage;
import org.w3c.dom.ls.LSOutput;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public class ProbabilityDistributionsIM extends AppCompatActivity {
RadioGroup rg_01 , rg_02;
RadioButton selectedButton;
//variable deceleration
private static final String TAG = MainActivity.class.getSimpleName();
private TessBaseAPI tessBaseAPI;
String FinalDatapath;
String FinalPathToTESS_BASE_API;
String imageString;
SetImageProperties setImageProperties;
OCR ocr;
Switch valueSwitch;
Python py = null;
List<String> extractedData;
Integer[] valuesTakenFromEditTextArray;
// ImageView imageView, img_greyview;
FloatingActionButton action_TakePhoto , action_UploadPhoto , action_voiceInput;
Button calculate;
TextView outputText;
Bitmap finalbitmap , CropBitmap;
EditText textInput, textInput_2;
//ExtractData class Instance
ExtractData extractData;
Uri uri;
// radio groups and buttons
RadioGroup.OnCheckedChangeListener group02;
RadioGroup rg_01 , rg_02;
RadioButton selectedRadioButton;
// --------------------------------------------------------------------------------------------- Speech Recognize Variables
private SpeechRecognizer speechRecognizer;
private TextToSpeech textToSpeech;
private TextView textView;
private Intent voiceintent;
@Override
......@@ -26,22 +106,131 @@ public class ProbabilityDistributionsIM extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_probability_distributions_i_m);
// variable initialization
// imageView = findViewById(R.id.outImage);
calculate = findViewById(R.id.btnTakeImage);
action_TakePhoto = findViewById(R.id.action_capturePhoto);
action_UploadPhoto = findViewById(R.id.action_uploadImage);
action_voiceInput = findViewById(R.id.action_voiceInput);
// img_greyview = findViewById(R.id.greyImg);
textInput = findViewById(R.id.keyboard_Input);
textInput_2 = findViewById(R.id.keyboard_Input_2);
valueSwitch = findViewById(R.id.switch_values);
rg_01 = findViewById(R.id.rg_01);
rg_02 = findViewById(R.id.rg_02);
setImageProperties = new SetImageProperties();
// Arraylist to pass the data
extractedData = new ArrayList<>();
valuesTakenFromEditTextArray = new Integer[]{};
// initializing the object of ExtractData class
extractData = new ExtractData();
//intitalzing the OCR object
ocr = new OCR();
//start python
if (!Python.isStarted()){
Python.start(new AndroidPlatform(this));
}
// creating python instance
py = Python.getInstance();
// ----------------------------------------------------------------------------------------- Initialize the variables for voice recognition
textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
}
});
voiceintent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
voiceintent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechRecognizer.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
// -------------------------------------------------------------------------------------Getting the result of the speech recognition
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(speechRecognizer.RESULTS_RECOGNITION);
String string = "";
textInput.setText("");
if (matches != null){
string = matches.get(0);
textInput.setText(string);
}
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
});
//radio button actions
RadioGroup.OnCheckedChangeListener group01 = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
selectedRadioButton = findViewById(checkedId);
showMessege();
rg_02.setOnCheckedChangeListener(null);
rg_02.clearCheck();
rg_02.setOnCheckedChangeListener(group02);
}
};
group02 = new RadioGroup.OnCheckedChangeListener() {
group02 = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
selectedRadioButton = findViewById(checkedId);
showMessege();
rg_01.setOnCheckedChangeListener(null);
rg_01.clearCheck();
rg_01.setOnCheckedChangeListener(group01);
......@@ -51,42 +240,402 @@ public class ProbabilityDistributionsIM extends AppCompatActivity {
rg_01.setOnCheckedChangeListener(group01);
rg_02.setOnCheckedChangeListener(group02);
//radio button work finish here
/* rg_01.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
// button actions
action_TakePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
selectedButton = findViewById(checkedId);
rg_02.clearCheck();
public void onClick(View v) {
Animation animation = AnimationUtils.loadAnimation(ProbabilityDistributionsIM.this,R.anim.blink);
action_TakePhoto.startAnimation(animation);
// TakePicture();
CropImage.activity().start(ProbabilityDistributionsIM.this);
}
});
action_UploadPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Animation animation = AnimationUtils.loadAnimation(ProbabilityDistributionsIM.this,R.anim.blink);
action_UploadPhoto.startAnimation(animation);
Toast.makeText(ProbabilityDistributionsIM.this,"This feature will available soon",Toast.LENGTH_LONG).show();
}
});
// ------------------------------------------------------------------------------------------------------ Start the speech recognition
action_voiceInput.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
Animation animation = AnimationUtils.loadAnimation(ProbabilityDistributionsIM.this,R.anim.blink);
action_voiceInput.startAnimation(animation);
});
textToSpeech.speak("Please tell me your data set first ?",TextToSpeech.QUEUE_FLUSH,null,null);
rg_02.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
selectedButton = findViewById(checkedId);
rg_01.clearCheck();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
speechRecognizer.startListening(voiceintent);
}
});
valueSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String textInput1 = null;
String textInput2 = null;
if (isChecked){
Toast.makeText(ProbabilityDistributionsIM.this,"Value came as true",Toast.LENGTH_SHORT).show();
textInput1 = textInput.getText().toString();
textInput2 = textInput_2.getText().toString();
textInput_2.setText(textInput1);
textInput.setText(textInput2);
}else{
Toast.makeText(ProbabilityDistributionsIM.this,"Value came as false",Toast.LENGTH_SHORT).show();
textInput1 = textInput.getText().toString();
textInput2 = textInput_2.getText().toString();
textInput_2.setText(textInput1);
textInput.setText(textInput2);
}
}
});
/*
rg_03.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
calculate.setOnClickListener(new View.OnClickListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
selectedButton = findViewById(checkedId);
rg_01.clearCheck();
rg_02.clearCheck();
public void onClick(View v) {
String selectedType = null;
if (selectedRadioButton == null) {
Toast.makeText(ProbabilityDistributionsIM.this, "You must Select A Question Type", Toast.LENGTH_SHORT).show();
} else {
//getting calculation type by radio butons
selectedType = selectedRadioButton.getText().toString();
// destroy the speech recognition instance
speechRecognizer.destroy();
// -------------**** getting the final input from edit text
String output = textInput.getText().toString().trim();
if (extractedData.size() == 0) {
extractedData.add(output); // adding data to List
}
System.out.println("ExctractedData list size " + extractedData.size());
// adding List to array in order to pass to ExtractData function
String[] dataArray = new String[extractedData.size()];
dataArray = extractedData.toArray(dataArray);
//list to receive the extrated data
List<String> extractedDataset;
DescriptiveStatisticsQuestionComparation dsqc = new DescriptiveStatisticsQuestionComparation();
List<String> reading = readDesQuestions();
List<String> extractDatasetForEssay;
String[] extractDatasetForEssayArray = new String[0];
String extractedKeywordsFromFuzzy = null;
if (selectedType.equals("Solve Essay problem")) {
extractedKeywordsFromFuzzy = dsqc.DescriptiveStatisticsQuestionComparewithCSV(output, reading);
System.out.println("extractedKeywordsFromFuzzy " + extractedKeywordsFromFuzzy);
//--------------------extrct dataset from DescripticeStatsQuesCompare class using ExtractDatasetfromDescriptiveQuestion method -----------------------------
extractDatasetForEssay = dsqc.ExtractDatasetFromDescriptiveQuestion(output);
System.out.println("extractDatasetForEssay " + extractDatasetForEssay);
// Converting list to array after data extraction function
extractDatasetForEssayArray = new String[extractDatasetForEssay.size()];
extractDatasetForEssayArray = extractDatasetForEssay.toArray(extractDatasetForEssayArray);
}
//calling the extract data function for normal question solvings
extractedDataset = extractData.ExtractionWithComma(dataArray);
//-------------------------------------------------------------------------------------------------------------------------------- remove lateer
// Converting list to array after daa extraction function
String[] datasetArray = new String[extractedDataset.size()];
datasetArray = extractedDataset.toArray(datasetArray);
// System.out.println("selected Type "+selectedRadioButton.getText().toString());
Intent intent = new Intent(ProbabilityDistributionsIM.this, DescriptiveStatisticsCalcuation.class);
intent.putExtra("dataset", datasetArray);
intent.putExtra("des_calculation_type", selectedType);
if (selectedType.equals("Solve Essay problem")) {
intent.putExtra("extractDatasetForEssayArray", extractDatasetForEssayArray);
intent.putExtra("extractedKeywordsFromFuzzy", extractedKeywordsFromFuzzy);
}
extractedDataset.clear();
datasetArray = null;
startActivity(intent);
}
}
});
*/
}
public void showMessage(){
Toast.makeText(this,"'"+selectedButton.getText().toString()+"'",Toast.LENGTH_SHORT).show();
// function to start the camera activity
private void TakePicture() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,0);
}
// After Image Capture activity execute
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check whether activity completed successfully
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK){
uri = result.getUri();
// imageView.setImageURI(uri);
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
finalbitmap = bitmap;
} catch (IOException e) {
e.printStackTrace();
}
// img_greyview.setImageBitmap(bitmap);
}else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE){
Exception e = result.getError();
Toast.makeText(this,"Possible Error is : "+e,Toast.LENGTH_LONG).show();
}
}
//Check the permissions before accessing the external storage
if (ActivityCompat.checkSelfPermission(ProbabilityDistributionsIM.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.checkSelfPermission(ProbabilityDistributionsIM.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
PrepareTessData();
startOCR(finalbitmap);
}else {
ActivityCompat.requestPermissions(ProbabilityDistributionsIM.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},101);
}
}else{
//when permission is not granted
//Request Permission
ActivityCompat.requestPermissions(ProbabilityDistributionsIM.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
}
}
// When Requesting permissions
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//check Condition
if (requestCode == 100 && (grantResults.length > 0 ) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)){
//when permission is granted
// call method
PrepareTessData();
startOCR(finalbitmap);
}else if (requestCode == 101 && (grantResults.length > 0 ) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)){
PrepareTessData();
startOCR(finalbitmap);
} else {
Toast.makeText(getApplicationContext(),"Permission not granted",Toast.LENGTH_LONG).show();
}
}
//prepare the data for Tesseract
private void PrepareTessData(){
try {
String fileList[] = getAssets().list("trainedData");
for (String fileName : fileList) {
File file = new File(Environment.getExternalStorageDirectory()
+ "/tesseract/tessdata/");
if (!file.exists()){
file.mkdirs();
}
if ((file.exists())) {
try {
InputStream in = getAssets().open(fileName);
String sdCardPath = Environment.getExternalStorageDirectory()
+ "/tesseract/tessdata";
FinalDatapath = sdCardPath + "/eng.traineddata";
FinalPathToTESS_BASE_API = Environment.getExternalStorageDirectory() + "/tesseract/";
System.out.println("sdpath "+sdCardPath);
OutputStream out = new FileOutputStream(FinalDatapath);
byte [] buff = new byte[1024];
int len;
while(( len = in.read(buff)) > 0){
out.write(buff,0,len);
}
in.close();
out.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
// start OCR function
private void startOCR(Bitmap bitmap){
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 7;
//---------------------------------- image preprocesisng convert into greyscale --------------------------------
Bitmap greybmp = setImageProperties.Convert_greyScale(bitmap,py);
//...................................................... thresholding ------------------------------------------
Bitmap thresholding = setImageProperties.Convert_thresholding(greybmp,py);
//...................................................... noise remove ------------------------------------------
Bitmap remove_noise = setImageProperties.Convert_noiseReduction(thresholding,py);
//...................................................... Opening (erosion followed by dilation) ------------------------------------------
Bitmap opening = setImageProperties.Morophology_Opening(greybmp,py);
//...................................................... Canny ------------------------------------------
Bitmap Canny = setImageProperties.Canny(greybmp,py);
// setting the grey scale image
// img_greyview.setImageBitmap(greybmp);
// creating new thread to start OCR
new Thread(new Runnable() {
public void run(){
String result = ocr.getOCRresult(greybmp,FinalPathToTESS_BASE_API);
runOnUiThread(new Runnable() {
@Override
public void run() {
//setting extracted value to editText
textInput.setText(result);
}
});
}
}).start();
}catch (Exception e){
e.printStackTrace();
}
// progressBar.setVisibility(View.INVISIBLE);
}
// show the selected question type by radio button
public void showMessege(){
Toast.makeText(this,"'"+selectedRadioButton.getText().toString()+"'",Toast.LENGTH_SHORT).show();
}
private List<String> readDesQuestions(){
String[] printQuestion = new String[500];
List<DescriptiveStatisticsCSVfile> descriptiveQuestions= new ArrayList<>();
List<String> StringdescriptiveQuestions= new ArrayList<>();
InputStream is = getResources().openRawResource(R.raw.sample1);
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8"))
);
String line = "";
try {
/*int lines = 0;
while(reader.readLine() != null){
lines++;
}*/
while ((line = reader.readLine()) != null) {
//Split by '"'
String tokens = line;
//Read the csv
DescriptiveStatisticsCSVfile question = new DescriptiveStatisticsCSVfile();
question.setQuestion(tokens);
descriptiveQuestions.add(question);
StringdescriptiveQuestions.add(tokens);
//printQuestion[lines] = line;
Log.d("MyActivity", "Just created: " + question);
}
} catch (IOException e) {
Log.wtf("MyActivity", "Error reading data file on line " + line, e);
e.printStackTrace();
}
finally {
try {
reader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
return StringdescriptiveQuestions;
}
}
\ No newline at end of file
......@@ -6,86 +6,183 @@
android:layout_height="match_parent"
tools:context=".inputMethod.ProbabilityDistributionsIM">
<Button
android:id="@+id/btnTakeImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Calculate"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.973" />
<RadioGroup
android:id="@+id/rg_01"
<TextView
android:id="@+id/textView"
android:layout_width="345dp"
android:layout_height="26dp"
android:layout_marginTop="56dp"
android:text="@string/des_input_messege"
app:layout_constraintBottom_toTopOf="@+id/outImage"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.439"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.059" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/action_capturePhoto"
android:layout_width="57dp"
android:layout_height="63dp"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.081"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.674"
app:maxImageSize="66dp"
app:srcCompat="@drawable/takephoto1" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/action_uploadImage"
android:layout_width="57dp"
android:layout_height="63dp"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.672"
app:maxImageSize="66dp"
app:srcCompat="@drawable/uploadimage" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/action_voiceInput"
android:layout_width="57dp"
android:layout_height="63dp"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.895"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.672"
app:maxImageSize="66dp"
app:srcCompat="@drawable/voice_input" />
<EditText
android:id="@+id/keyboard_Input"
android:layout_width="357dp"
android:layout_height="106dp"
android:background="@drawable/custom_editext"
android:ems="10"
android:hint="Enter Values for X"
android:inputType="textPersonName"
android:paddingStart="12dp"
android:paddingEnd="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.6"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.172" />
<EditText
android:id="@+id/keyboard_Input_2"
android:layout_width="357dp"
android:layout_height="106dp"
android:background="@drawable/custom_editext"
android:ems="10"
android:hint="Enter Values for P(X)"
android:inputType="textPersonName"
android:paddingStart="12dp"
android:paddingEnd="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.611"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
<TextView
android:id="@+id/plzselect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Standard Deviation Calculation"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.543"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<RadioGroup
android:id="@+id/rg_01"
android:layout_width="190dp"
android:layout_height="129dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.091"
app:layout_constraintHorizontal_bias="0.131"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.116">
app:layout_constraintVertical_bias="0.911">
<RadioButton
android:id="@+id/rg_1_mean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mean" />
android:text="Mean (expectation) of a distribution" />
<RadioButton
android:id="@+id/rg_01_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mode" />
android:text="Standard Deviation of a distribution" />
<RadioButton
android:id="@+id/rg_01_median"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Median" />
<RadioButton
android:id="@+id/rg_03_Q3"
android:id="@+id/rg_03_Q4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Third Quartile" />
android:text="Solve Essay problem" />
</RadioGroup>
<RadioGroup
android:id="@+id/rg_02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="444dp"
android:layout_width="115dp"
android:layout_height="90dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.619"
app:layout_constraintStart_toStartOf="parent">
app:layout_constraintHorizontal_bias="0.824"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.847">
<RadioButton
android:id="@+id/rg_02_mean"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Minimum" />
android:text="Variance of a distribution" />
<RadioButton
android:id="@+id/rg_02_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Maximum" />
<RadioButton
android:id="@+id/rg_02_median"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Range" />
<RadioButton
android:id="@+id/rg_03_q1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="First Quartile" />
<RadioButton
android:id="@+id/rg_03_IQR"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Interquartile Range" />
</RadioGroup>
<Switch
android:id="@+id/switch_values"
android:layout_width="246dp"
android:layout_height="49dp"
android:text="Switch Values for X and P(X)"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.482"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.354" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment