diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..cbed508 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4872587 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/WinRate.iml b/WinRate.iml new file mode 100644 index 0000000..50db137 --- /dev/null +++ b/WinRate.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WinRate/Arin_comments.txt b/WinRate/Arin_comments.txt deleted file mode 100644 index e681561..0000000 --- a/WinRate/Arin_comments.txt +++ /dev/null @@ -1,12 +0,0 @@ -Navigation bar added -Foundation for creating tabs (fragments) added -Logic to hide keyboard added (currently commented out as it's a bit buggy, works sometimes, other times crashes) -MyUtilities class added for helper functions - -Notes: -I've commented out almost all of the code added to calculate winrate from the edittext fields as i've changed the foundation layout. Instead of residing in the main activity, the text boxes have been moved to the input form fragment. The code will most likely need to be moved to the InputFormFragment class. -I could not get the log-in feature of firebase working so I changed the default activity back to MainActivity which hosts the navigationview layout and defaults to the Input Form fragment. - -Things to work on: -Debug keyboard functionality -Add functionality to switch between fragments from the navigation bar \ No newline at end of file diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/MainActivity.java b/WinRate/app/src/main/java/com/ucsc/winrate/MainActivity.java index ce23231..85f5597 100644 --- a/WinRate/app/src/main/java/com/ucsc/winrate/MainActivity.java +++ b/WinRate/app/src/main/java/com/ucsc/winrate/MainActivity.java @@ -4,7 +4,6 @@ import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.navigation.NavigationView; import com.google.android.material.snackbar.Snackbar; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; @@ -25,8 +24,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.CompoundButton; @@ -37,21 +34,19 @@ import java.util.Calendar; import java.util.Date; -public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { +public class MainActivity extends AppCompatActivity { //declare the necessary variables. - static int winC, loseC, curWinSum, curLoseSum;//winC,loseC are the counter of win or lose. + static int winC,loseC,curWinSum,curLoseSum;//winC,loseC are the counter of win or lose. static int DataCounter = 0; static boolean result;//result iss used for storing the value of switch. - EditText playerDeck, opponentName, opponentDeck;// EditText for user input. - //View parentView;//ID of parent view for reference + EditText playerDeck,opponentName, opponentDeck;// EditText for user input. Switch WinLose; Button submit,UserProfile; FirebaseDatabase mFireBase = FirebaseDatabase.getInstance();//declare Firebase database DatabaseReference myRef = mFireBase.getReference();//reference of database, mainly used by us as a path for storing files FirebaseUser curUser = FirebaseAuth.getInstance().getCurrentUser();//Current User, it is used to get Displayname, email or Uid. - private AppBarConfiguration mAppBarConfiguration; @Override protected void onCreate(Bundle savedInstanceState) { @@ -66,11 +61,10 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); DrawerLayout drawer = findViewById(R.id.activityMain); NavigationView navigationView = findViewById(R.id.nav_view); - navigationView.setNavigationItemSelectedListener(this); // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.navInputForm, R.id.navStatistics,R.id.navContactBook,R.id.navLifeCounter,R.id.navSettings) + R.id.nav_inputForm, R.id.nav_stats) .setDrawerLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); @@ -83,120 +77,101 @@ protected void onCreate(Bundle savedInstanceState) { //} //}); //declare each element in the input layout - //playerDeck = findViewById(R.id.playerDeckText); - //opponentName = findViewById(R.id.opponentNameText); - //opponentDeck = findViewById(R.id.opponentDeckText); + playerDeck = findViewById(R.id.playerDeckText); + opponentName = findViewById(R.id.opponentNameText); + opponentDeck = findViewById(R.id.opponentDeckText); - //WinLose = findViewById(R.id.winSwitch); + WinLose = findViewById(R.id.winSwitch); - //submit = findViewById(R.id.submitButton); + submit = findViewById(R.id.submitButton); //OnCheckChangeListener is a listener which can detect the switch is on or off - //WinLose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - //@Override - //public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - //result = isChecked; - //if(isChecked){ - //winC = 1; - //}else{ - //loseC = 1; - //} - //} - //}); + WinLose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + result = isChecked; + if(isChecked){ + winC = 1; + }else{ + loseC = 1; + } + } + }); - //myRef.addValueEventListener(new ValueEventListener() { - //@Override - //public void onDataChange(@NonNull DataSnapshot dataSnapshot) { + myRef.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot dataSnapshot) { - //} + } - //@Override - //public void onCancelled(@NonNull DatabaseError databaseError) { + @Override + public void onCancelled(@NonNull DatabaseError databaseError) { - //} - //}); + } + }); - //submit.setOnClickListener(new View.OnClickListener() { - //@Override - //public void onClick(View v) { - //addData(); - //} - //}); + submit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addData(); + } + }); - //addData() will add the data to the firebase - //private void addData(){ - //String UserID = curUser.getDisplayName(); - //String id = myRef.push().getKey(); - //get date data by Calendar. - //And get text from elements in layout and convert them to string - //Date curD = Calendar.getInstance().getTime(); - //String pD = playerDeck.getText().toString(); - //String oN = opponentName.getText().toString(); - //String oD = opponentDeck.getText().toString(); - //String DataName = "data" + DataCounter; - //Toast.makeText(this,UserID,Toast.LENGTH_LONG).show(); - - //WinRateData winData = new WinRateData(pD,oN,oD,result,curD); - //DatabaseReference newRef = myRef.child(curUser.getUid()); - //newRef.addValueEventListener(new ValueEventListener() { - //@Override - //public void onDataChange(@NonNull DataSnapshot dataSnapshot) { - //curWinSum = Integer.parseInt(dataSnapshot.child("winSum").getValue().toString()); - //curLoseSum = Integer.parseInt(dataSnapshot.child("loseSum").getValue().toString()); - //curWinSum = curWinSum + winC; - //curLoseSum = curLoseSum + loseC; - //} - //@Override - //public void onCancelled(@NonNull DatabaseError databaseError) { - //} - //}); - - //myRef.child(curUser.getUid()).child("winSum").setValue(curWinSum); - //myRef.child(curUser.getUid()).child("loseSum").setValue(curLoseSum); - //myRef.child(curUser.getUid()).child("winSum").setValue(winC); - //myRef.child(curUser.getUid()).child("loseSum").setValue(loseC); - //myRef.child(curUser.getUid()).child(myRef.push().getKey()).setValue(winData); - - //LargeData newdata = new LargeData(winC, loseC, winData, DataName, curUser, myRef); - //DataCounter++; - - } - - //@Override - //public boolean onCreateOptionsMenu(Menu menu) { - //Inflate the menu; this adds items to the action bar if it is present. - // getMenuInflater().inflate(R.menu.options_menu, menu); - // return true; //} + //addData() will add the data to the firebase + private void addData(){ + //String UserID = curUser.getDisplayName(); + //String id = myRef.push().getKey(); + //get date data by Calendar. + //And get text from elements in layout and convert them to string + Date curD = Calendar.getInstance().getTime(); + String pD = playerDeck.getText().toString(); + String oN = opponentName.getText().toString(); + String oD = opponentDeck.getText().toString(); + //String DataName = "data" + DataCounter; + //Toast.makeText(this,UserID,Toast.LENGTH_LONG).show(); + + WinRateData winData = new WinRateData(pD,oN,oD,result,curD); + DatabaseReference newRef = myRef.child(curUser.getUid()); + newRef.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot dataSnapshot) { + curWinSum = Integer.parseInt(dataSnapshot.child("winSum").getValue().toString()); + curLoseSum = Integer.parseInt(dataSnapshot.child("loseSum").getValue().toString()); + curWinSum = curWinSum + winC; + curLoseSum = curLoseSum + loseC; + } + + @Override + public void onCancelled(@NonNull DatabaseError databaseError) { + + } + }); + + myRef.child(curUser.getUid()).child("winSum").setValue(curWinSum); + myRef.child(curUser.getUid()).child("loseSum").setValue(curLoseSum); + //myRef.child(curUser.getUid()).child("winSum").setValue(winC); + //myRef.child(curUser.getUid()).child("loseSum").setValue(loseC); + myRef.child(curUser.getUid()).child(myRef.push().getKey()).setValue(winData); + + //LargeData newdata = new LargeData(winC, loseC, winData, DataName, curUser, myRef); + DataCounter++; + + /*BEGIN INITIALIZATION OF ROOM DATABASE*/ + RecyclerView recyclerView = findViewById(R.id.recyclerview); + final GameLogAdapter adapter = new GameLogAdapter(this); + //recyclerView.setAdapter(adapter); // bugs on these two lines + //recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + /*END INITIALIZATION OF ROOM DATABASE*/ - @Override - public boolean onSupportNavigateUp() { - NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); - return NavigationUI.navigateUp(navController, mAppBarConfiguration) - || super.onSupportNavigateUp(); } @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); - switch (item.getItemId()) { - case R.id.navInputForm: - navController.navigate(R.id.navInputForm); - break; - case R.id.navStatistics: - navController.navigate(R.id.navStatistics); - break; - case R.id.navContactBook: - navController.navigate(R.id.navContactBook); - break; - case R.id.navLifeCounter: - navController.navigate(R.id.navLifeCounter); - break; - case R.id.navSettings: - navController.navigate(R.id.navSettings); - break; - } + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.draw_menu, menu); return true; } } diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/MyUtilities.java b/WinRate/app/src/main/java/com/ucsc/winrate/MyUtilities.java index 4842ca9..8b3e2fd 100644 --- a/WinRate/app/src/main/java/com/ucsc/winrate/MyUtilities.java +++ b/WinRate/app/src/main/java/com/ucsc/winrate/MyUtilities.java @@ -1,41 +1,55 @@ package com.ucsc.winrate; -import android.app.Activity; -import android.view.Menu; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; +import android.os.Bundle; +import android.widget.Toast; -import androidx.core.content.ContextCompat; +import java.util.ArrayList; +import java.util.List; -import com.google.android.material.navigation.NavigationView; +public class MyUtilities { + public static class PieChartActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chart_common); -public class MyUtilities { - static void closeKeyboard(Activity activity) { - InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); - } + AnyChartView anyChartView = findViewById(R.id.any_chart_view); + anyChartView.setProgressBar(findViewById(R.id.progress_bar)); - static void setupUI(final View view) { - if (!(view instanceof EditText)) { - view.setOnTouchListener(new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - closeKeyboard((Activity)view.getContext()); - return false; + Pie pie = AnyChart.pie(); + + pie.setOnClickListener(new ListenersInterface.OnClickListener(new String[]{"x", "value"}) { + @Override + public void onClick(Event event) { + Toast.makeText(PieChartActivity.this, event.getData().get("x") + ":" + event.getData().get("value"), Toast.LENGTH_SHORT).show(); } }); - } - //If a layout container, iterate over children and seed recursion. - if (view instanceof ViewGroup) { - for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { - View innerView = ((ViewGroup) view).getChildAt(i); - setupUI(innerView); - } + List data = new ArrayList<>(); + data.add(new ValueDataEntry("Apples", 6371664)); + data.add(new ValueDataEntry("Pears", 789622)); + data.add(new ValueDataEntry("Bananas", 7216301)); + data.add(new ValueDataEntry("Grapes", 1486621)); + data.add(new ValueDataEntry("Oranges", 1200000)); + + pie.data(data); + + pie.title("Fruits imported in 2015 (in kg)"); + + pie.labels().position("outside"); + + pie.legend().title().enabled(true); + pie.legend().title() + .text("Retail channels") + .padding(0d, 0d, 10d, 0d); + + pie.legend() + .position("center-bottom") + .itemsLayout(LegendLayout.HORIZONTAL) + .align(Align.CENTER); + + anyChartView.setChart(pie); } } } - diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/PieChart.java b/WinRate/app/src/main/java/com/ucsc/winrate/PieChart.java new file mode 100644 index 0000000..7ccd9d3 --- /dev/null +++ b/WinRate/app/src/main/java/com/ucsc/winrate/PieChart.java @@ -0,0 +1,63 @@ +package com.ucsc.winrate; +// https://github.com/AnyChart/AnyChart-Android +import android.os.Bundle; +import android.widget.Toast; + +import com.anychart.AnyChart; +import com.anychart.AnyChartView; +import com.anychart.chart.common.dataentry.DataEntry; +import com.anychart.chart.common.dataentry.ValueDataEntry; +import com.anychart.chart.common.listener.Event; +import com.anychart.chart.common.listener.ListenersInterface; +import com.anychart.charts.Pie; +import com.anychart.enums.Align; +import com.anychart.enums.LegendLayout; + +import java.util.ArrayList; +import java.util.List; + +public class PieChartActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chart_common); + + AnyChartView anyChartView = findViewById(R.id.any_chart_view); + anyChartView.setProgressBar(findViewById(R.id.progress_bar)); + + Pie pie = AnyChart.pie(); + + pie.setOnClickListener(new ListenersInterface.OnClickListener(new String[]{"x", "value"}) { + @Override + public void onClick(Event event) { + Toast.makeText(PieChartActivity.this, event.getData().get("x") + ":" + event.getData().get("value"), Toast.LENGTH_SHORT).show(); + } + }); + + List data = new ArrayList<>(); + data.add(new ValueDataEntry("Apples", 6371664)); + data.add(new ValueDataEntry("Pears", 789622)); + data.add(new ValueDataEntry("Bananas", 7216301)); + data.add(new ValueDataEntry("Grapes", 1486621)); + data.add(new ValueDataEntry("Oranges", 1200000)); + + pie.data(data); + + pie.title("Fruits imported in 2015 (in kg)"); + + pie.labels().position("outside"); + + pie.legend().title().enabled(true); + pie.legend().title() + .text("Retail channels") + .padding(0d, 0d, 10d, 0d); + + pie.legend() + .position("center-bottom") + .itemsLayout(LegendLayout.HORIZONTAL) + .align(Align.CENTER); + + anyChartView.setChart(pie); + } +} diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/SignIn.java b/WinRate/app/src/main/java/com/ucsc/winrate/SignIn.java index c7a4b00..d3e78b7 100644 --- a/WinRate/app/src/main/java/com/ucsc/winrate/SignIn.java +++ b/WinRate/app/src/main/java/com/ucsc/winrate/SignIn.java @@ -18,14 +18,12 @@ public class SignIn extends AppCompatActivity { private FirebaseAuth firebaseAuth; - View parentView;//ID of parent view for reference @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); - parentView = findViewById(R.id.signInLayout); - //MyUtilities.setupUI(parentView); + firebaseAuth = FirebaseAuth.getInstance(); final EditText usernameEditText = findViewById(R.id.username); diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsFragment.java b/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsFragment.java index 981ae47..477995a 100644 --- a/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsFragment.java +++ b/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsFragment.java @@ -95,4 +95,4 @@ private SpannableString generateCenterText() { s.setSpan(new ForegroundColorSpan(Color.GRAY), 8, s.length(), 0); return s; } -} \ No newline at end of file +} diff --git a/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsViewModel.java b/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsViewModel.java index ecc6445..557f167 100644 --- a/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsViewModel.java +++ b/WinRate/app/src/main/java/com/ucsc/winrate/ui/stats/StatsViewModel.java @@ -16,4 +16,4 @@ public StatsViewModel() { public LiveData getText() { return mText; } -} \ No newline at end of file +} diff --git a/WinRate/app/src/main/res/layout/activity_main.xml b/WinRate/app/src/main/res/layout/activity_main.xml index eb63e40..241beac 100644 --- a/WinRate/app/src/main/res/layout/activity_main.xml +++ b/WinRate/app/src/main/res/layout/activity_main.xml @@ -1,29 +1,123 @@ - - - - - - - \ No newline at end of file + tools:context=".MainActivity"> + + + + + + + + + + + + + + + + + +