package com.linseykate.findingfido; /** * Main activity that creates fragments * for each tab and pushes records to * Firebase * * Help accessing GlobalVariables class from http://stackoverflow.com/questions/1944656/android-global-variable */ import android.app.Activity; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.media.Image; import android.provider.ContactsContract; import android.support.design.widget.TabLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.os.Bundle; import android.util.Base64; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.ListView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.firebase.client.ChildEventListener; import com.firebase.client.DataSnapshot; import com.firebase.client.Firebase; import com.firebase.client.FirebaseError; import com.firebase.client.Query; import com.firebase.client.ValueEventListener; import com.shaded.fasterxml.jackson.databind.deser.DataFormatReaders; import java.io.ByteArrayOutputStream; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link FragmentPagerAdapter} derivative, which will keep every * loaded fragment in memory. If this becomes too memory intensive, it * may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ private SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; Firebase ref = new Firebase("https://findingfido.firebaseio.com/"); int sizeBarVal; ArrayList dogRecords; ArrayList recordIds; int recordIdsLength; int tempRecordNo; String newRecordNo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*dogRecords = new ArrayList<>(); recordIds = new ArrayList<>();*/ //Initial read-in of all data in Firebase ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { dogRecords = new ArrayList<>(); recordIds = new ArrayList<>(); for (DataSnapshot child : snapshot.getChildren()) { if(child.getKey().length()==3) { //Dog Record DogAttributes records = child.getValue(DogAttributes.class); //store record in class variable tempRecordNo = Integer.parseInt(child.getKey()) + 1; //set next record number based on last in dogRecords.add(records); RecordNoKeeper recordKeeper = new RecordNoKeeper(); recordKeeper.setImageString(records.getImageString()); recordKeeper.setRecordKey(child.getKey()); recordIds.add(recordKeeper); } else { //user data } } if(String.valueOf(tempRecordNo).length()==1){ //Records 1-9 newRecordNo = "00"+String.valueOf(tempRecordNo); } else { //Records 10+ newRecordNo = "0" + String.valueOf(tempRecordNo); } /*System.out.println("TEST dogRecords:" + dogRecords.size()); System.out.println("TEST recordIds:" + recordIds.size());*/ ((GlobalVariables) getApplication()).setDogRecords(dogRecords); ((GlobalVariables) getApplication()).setRecordIds(recordIds); recordIdsLength = recordIds.size(); } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("The read failed: " + firebaseError.getMessage()); } }); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; } if (id == R.id.action_logout) { ref.unauth(); finish(); return true; } if(id == R.id.action_notification) { Intent intent = new Intent(this, NotificationsActivity.class); startActivity(intent); } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ private static final String ARG_SECTION_NUMBER = "section_number"; public PlaceholderFragment() { } /** * Returns a new instance of this fragment for the given section * number. */ public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //if getArguments().getInt(ARG_SECTION_NUMBER) == 1,2,3 use different R.layout.fragment final View rootView; int sectionNumber = getArguments().getInt(ARG_SECTION_NUMBER); switch (sectionNumber) { //Photo Tab case 1: rootView = inflater.inflate(R.layout.fragment_photo, container, false); Button btnUploadImage = (Button)rootView.findViewById(R.id.btnUpload); btnUploadImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getActivity(), DrawingActivity.class); intent.putExtra("button_id", view.getId()); getActivity().startActivity(intent); } }); Button btnTakeImage = (Button)rootView.findViewById(R.id.btnTake); btnTakeImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getActivity(), DrawingActivity.class); intent.putExtra("button_id", view.getId()); getActivity().startActivity(intent); } }); final RadioGroup dogColor = (RadioGroup)rootView.findViewById(R.id.rgColors); SeekBar sizeBar = (SeekBar)rootView.findViewById(R.id.seekBarSize); sizeBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { ((MainActivity)getActivity()).sizeBarVal = i; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); Button btnSubmit = (Button)rootView.findViewById(R.id.btnSubmit); btnSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //perform calculations and push record to Firebase DogAttributes dogObject = new DogAttributes(); double calcVal; double headWidth; double headHeight; Bitmap bitmap = ((BitmapDrawable)((GlobalVariables) getActivity().getApplication()).getDogPic().getDrawable()).getBitmap(); Firebase userRef = ((MainActivity)getActivity()).ref.child(((MainActivity)getActivity()).newRecordNo); ((GlobalVariables)getActivity().getApplication()).setRecentRecordNo(((MainActivity)getActivity()).newRecordNo); userRef.child("imageString").setValue(encodeToBase64(bitmap, Bitmap.CompressFormat.JPEG, 100)); dogObject.setImageString(encodeToBase64(bitmap, Bitmap.CompressFormat.JPEG, 100)); userRef.child("userString").setValue(((MainActivity) getActivity()).ref.getAuth().getUid()); dogObject.setUserString(((MainActivity) getActivity()).ref.getAuth().getUid()); headWidth = calcVal = ((GlobalVariables) getActivity().getApplication()).getHeadFinishX() - ((GlobalVariables) getActivity().getApplication()).getHeadStartX(); userRef.child("headWidth").setValue(calcVal); dogObject.setHeadWidth(calcVal); headHeight = calcVal = ((GlobalVariables) getActivity().getApplication()).getHeadFinishY() - ((GlobalVariables) getActivity().getApplication()).getHeadStartY(); userRef.child("headHeight").setValue(calcVal); dogObject.setHeadHeight(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getrEyeFinishX() - ((GlobalVariables) getActivity().getApplication()).getlEyeStartX(); calcVal = calcVal/headWidth; userRef.child("eyeOutside").setValue(calcVal); dogObject.setEyeOutside(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getrEyeStartX() - ((GlobalVariables) getActivity().getApplication()).getlEyeFinishX(); calcVal = calcVal/headWidth; userRef.child("eyeInside").setValue(calcVal); dogObject.setEyeInside(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getNoseFinishY() - (((GlobalVariables) getActivity().getApplication()).getlEyeStartY()+((GlobalVariables) getActivity().getApplication()).getrEyeStartY())/2; calcVal = calcVal/headHeight; userRef.child("eyeNoseOutside").setValue(calcVal); dogObject.setEyeNoseOutside(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getNoseStartY() - (((GlobalVariables) getActivity().getApplication()).getlEyeFinishY()+((GlobalVariables) getActivity().getApplication()).getrEyeFinishY())/2; calcVal = calcVal/headHeight; userRef.child("eyeNoseInside").setValue(calcVal); dogObject.setEyeNoseInside(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getNoseStartY() - ((GlobalVariables) getActivity().getApplication()).getHeadStartY(); calcVal = calcVal/headHeight; userRef.child("headNoseTop").setValue(calcVal); dogObject.setHeadNoseTop(calcVal); calcVal = ((GlobalVariables) getActivity().getApplication()).getNoseFinishY() - ((GlobalVariables) getActivity().getApplication()).getHeadStartY(); calcVal = calcVal/headHeight; userRef.child("headNoseBottom").setValue(calcVal); dogObject.setHeadNoseBottom(calcVal); RadioButton selectedColor = (RadioButton)dogColor.findViewById(dogColor.getCheckedRadioButtonId()); userRef.child("color").setValue(selectedColor.getText().toString()); dogObject.setColor(selectedColor.getText().toString()); userRef.child("size").setValue(((MainActivity) getActivity()).sizeBarVal); dogObject.setSize(((MainActivity) getActivity()).sizeBarVal); ((GlobalVariables) getActivity().getApplication()).setDogToMatch(dogObject); Toast toast = Toast.makeText(getActivity().getApplicationContext(), "Uploaded successfully!", Toast.LENGTH_SHORT); toast.show(); RelativeLayout temp = ((GlobalVariables) getActivity().getApplication()).getHiddenSection(); temp.setVisibility(View.INVISIBLE); Intent intent = new Intent(getActivity(), MatchActivity.class); getActivity().startActivity(intent); } }); ((GlobalVariables) getActivity().getApplication()).setHiddenSection((RelativeLayout)rootView.findViewById(R.id.visibleContainer)); ((GlobalVariables) getActivity().getApplication()).setDogPic((ImageView) rootView.findViewById(R.id.ivDogPic)); return rootView; //Browse Tab case 2: rootView = inflater.inflate(R.layout.fragment_browse, container, false); //Adapted from http://javatechig.com/android/android-gridview-example-building-image-gallery-in-android final GridView gridView; GridViewAdapter gridAdapter; gridView = (GridView) rootView.findViewById(R.id.gridView); gridAdapter = new GridViewAdapter(getContext(), R.layout.grid_item_layout, getData()); gridView.setAdapter(gridAdapter); Button btnFilter = (Button)rootView.findViewById(R.id.btnFilter); btnFilter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Refresh gridView.invalidateViews(); } }); return rootView; default: rootView = inflater.inflate(R.layout.fragment_main, container, false); } return rootView; } //Taken from http://stackoverflow.com/questions/9768611/encode-and-decode-bitmap-object-in-base64-string-in-android public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality) { ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); image.compress(compressFormat, quality, byteArrayOS); return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT); } public static Bitmap decodeBase64(String input) { byte[] decodedBytes = Base64.decode(input, 0); return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); } private ArrayList getData() { final ArrayList imageItems = new ArrayList<>(); Query queryRef = ((MainActivity)getActivity()).ref.orderByChild("picstring"); queryRef.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot snapshot, String previousChild) { //for (DataSnapshot child : snapshot.getChildren()) { //if(child.getKey().length()==3){ if(snapshot.getKey().length()==3){ DogAttributes records = snapshot.getValue(DogAttributes.class); Bitmap myBitmapAgain = decodeBase64(records.getImageString()); imageItems.add(new ImageItem(myBitmapAgain, getRecordId(records.getImageString()))); } //} } private String getRecordId(String imageStr) { for(int i=0; i<((MainActivity)getActivity()).recordIdsLength; i++){ if(((MainActivity)getActivity()).recordIds.get(i).getImageString().equals(imageStr)){ return ((MainActivity)getActivity()).recordIds.get(i).getRecordKey(); } } return null; } @Override public void onChildRemoved(DataSnapshot snapshot) { //do nothing } @Override public void onChildChanged(DataSnapshot snapshot, String previousChild) { //do nothing } @Override public void onChildMoved(DataSnapshot snapshot, String previousChild) { //do nothing } @Override public void onCancelled(FirebaseError error) { //do nothing } }); return imageItems; } } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). return PlaceholderFragment.newInstance(position + 1); } @Override public int getCount() { // Show 2 total pages. return 2; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "PHOTO"; case 1: return "BROWSE"; } return null; } } }