2018-SWENG/2018-SWENG-Radius

View on GitHub
app/src/main/java/ch/epfl/sweng/radius/profile/ProfileFragment.java

Summary

Maintainability
B
6 hrs
Test Coverage
package ch.epfl.sweng.radius.profile;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.button.MaterialButton;
import android.support.design.widget.TextInputEditText;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

import ch.epfl.sweng.radius.R;
import ch.epfl.sweng.radius.database.DBUserObserver;
import ch.epfl.sweng.radius.database.Database;
import ch.epfl.sweng.radius.database.MLocation;
import ch.epfl.sweng.radius.database.UserInfo;
import ch.epfl.sweng.radius.storage.Storage;
import ch.epfl.sweng.radius.utils.profileFragmentUtils.TextFileReader;
import de.hdodenhof.circleimageview.CircleImageView;

import static android.app.Activity.RESULT_OK;

public class ProfileFragment extends Fragment implements DBUserObserver {
    private final int MAX_SIZE_USERNAME = 20;
    private final int MAX_SIZE_STATUS = 50;
    private final int MAX_SIZE_INTERESTS = 100;
    private static int userRadius;

    CircleImageView userPhoto;
    TextView userNickname;
    TextView userStatus;
    TextInputEditText statusInput;
    TextInputEditText nicknameInput;
    SeekBar radiusBar;
    TextView radiusValue;
    MaterialButton saveButton;
    TextView userInterests;
    TextInputEditText interestsInput;
    TextView spokenLanguages;

    private Button selectLanguagesButton;
    private static ArrayList<String> selectableLanguages;
    private static boolean[] checkedLanguages;
    private static ArrayList<Integer> spokenLanguagesList;
    private static String languagesText;
    private static Uri mImageUri;

    public ProfileFragment() {
        spokenLanguagesList = new ArrayList<Integer>();
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @return A new instance of fragment SettingsFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static ProfileFragment newInstance() { // currently useless
        ProfileFragment fragment = new ProfileFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);

        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_profile, container, false);

        // Get the UI elements
        radiusBar = view.findViewById(R.id.radiusBar);
        radiusValue = view.findViewById(R.id.radiusValue);
        spokenLanguages =  view.findViewById(R.id.spokenLanguages);
        selectLanguagesButton = view.findViewById(R.id.languagesButton);
        userStatus = view.findViewById(R.id.userStatus);
        userNickname = view.findViewById(R.id.userNickname);
        userInterests = view.findViewById(R.id.userInterests);
        nicknameInput = view.findViewById(R.id.nicknameInput);
        statusInput = view.findViewById(R.id.statusInput);
        interestsInput = view.findViewById(R.id.interestsInput);
        saveButton = view.findViewById(R.id.saveButton);
        userPhoto = view.findViewById(R.id.userPhoto);

        // set a change listener on the SeekBar
        radiusBar.setOnSeekBarChangeListener(seekBarChangeListener);

        // Load the selectableLanguages
        selectableLanguages = TextFileReader.readLanguagesFromFile(getActivity());

        // Languages selection button
        checkedLanguages = new boolean[selectableLanguages.size()];
        selectLanguagesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createBuilder();
            }
        });

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onClickSaveButton();
            }
        });

        // Load the users info and display
        setUpInfos();

        // Listen to changes in the DB
        UserInfo.getInstance().addUserObserver(this);

        // Inflate the layout for this fragment
        return view;
    }

    public void setUpInfos(){
        //Get the current user
        MLocation current_user = UserInfo.getInstance().getCurrentPosition();

        // Fill the labels with the user info
        userNickname.setText(current_user.getTitle());
        userStatus.setText(current_user.getMessage());
        userInterests.setText("Interests: " + current_user.getInterests());
        languagesText = current_user.getSpokenLanguages();
        spokenLanguages.setText(languagesText);
        radiusValue.setText(current_user.getRadius() + "m");
        radiusBar.setProgress((int) UserInfo.getInstance().getCurrentPosition().getRadius());

        setUpProfilePhoto();
    }

    private void createBuilder() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());

        builder.setTitle("Pick the languages you speak");
        setBuilderMultiChoiceItems(builder);
        builder.setCancelable(true);
        setBuilderPositiveButton(builder);
        setBuilderNegativeButton(builder);
        setBuilderNeutralButton(builder);

        AlertDialog languageDialog = builder.create();
        languageDialog.show();
    }

    private void setBuilderMultiChoiceItems(AlertDialog.Builder builder) {
        builder.setMultiChoiceItems(selectableLanguages
                        .toArray(new String[selectableLanguages.size()])
                , checkedLanguages, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int position, boolean isChecked) {
                        if (isChecked) {
                            if (!spokenLanguagesList.contains(position)) {
                                spokenLanguagesList.add(new Integer(position));
                            }
                        } else if (spokenLanguagesList.contains(position)) {
                            spokenLanguagesList.remove(new Integer(position));
                        }
                    }
                });
    }

    private void setUpProfilePhoto() {
        MLocation current_user = UserInfo.getInstance().getCurrentPosition();

        if (current_user.getUrlProfilePhoto() != null && !current_user.getUrlProfilePhoto().equals("") && !Database.DEBUG_MODE) { // puts the image from database into the circle
            Picasso.get().load(current_user.getUrlProfilePhoto()).into(userPhoto);
        }

        userPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Select Profile Picture"), 1);

            }
        });
    }

    private void setBuilderPositiveButton(AlertDialog.Builder builder) {
        builder.setPositiveButton(R.string.ok_label, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //String languagesText = UserInfo.getInstance().getCurrentPosition().getSpokenLanguages();
                for (int i = 0; i < spokenLanguagesList.size() ; i++) {
                    if (!languagesText.contains(selectableLanguages.get(spokenLanguagesList.get(i)))) {
                        languagesText = languagesText + " " + selectableLanguages.get(spokenLanguagesList.get(i));
                        UserInfo.getInstance().getCurrentPosition()
                                .addLanguage(selectableLanguages.get(spokenLanguagesList.get(i)));
                        if (i != spokenLanguagesList.size() - 1) {
                            languagesText = languagesText + " ";
                        }
                    }
                }
                spokenLanguages.setText(languagesText);
            }
        });
    }

    private void setBuilderNegativeButton(AlertDialog.Builder builder) {
        builder.setNegativeButton(R.string.dismiss_label, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
    }

    private void setBuilderNeutralButton(AlertDialog.Builder builder) {
        builder.setNeutralButton(R.string.clearAll_label, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                for (int i = 0; i < checkedLanguages.length; i++) {
                    checkedLanguages[i] = false;
                }
                spokenLanguagesList.clear();
                languagesText = "";
                spokenLanguages.setText(languagesText);
            }
        });
    }

    private String truncateText(String text, int maxSize){
        if(text.length()>maxSize){
            return text.substring(0,maxSize-1);
        }
        return text;
    }


    private void onClickSaveButton() { // use upload file here
        String nicknameString = getDataFromTextInput(nicknameInput);
        String statusString = getDataFromTextInput(statusInput);
        String interestsString = getDataFromTextInput(interestsInput);

        nicknameString = nicknameString.replaceAll("[^A-Za-z0-9_]", "");
        nicknameString = truncateText(nicknameString,MAX_SIZE_USERNAME);
        statusString = truncateText(statusString,MAX_SIZE_STATUS);
        interestsString = truncateText(interestsString,MAX_SIZE_INTERESTS);

        if (!nicknameString.isEmpty()) {
            UserInfo.getInstance().getCurrentPosition().setTitle(nicknameString); userNickname.setText(nicknameString);
        }
        if (!statusString.isEmpty()) {
            UserInfo.getInstance().getCurrentPosition().setMessage(statusString); userStatus.setText(statusString);
        }

        if (!interestsString.isEmpty()) {
            UserInfo.getInstance().getCurrentPosition().setInterests(interestsString);userInterests.setText("Interests: " + interestsString);
        }

        if (Storage.getInstance().getStorageTask() == null || !Storage.getInstance().getStorageTask().isInProgress()) { // Upload the photo and its uri to storage and db
            Storage.getInstance().uploadFile( mImageUri, this.getActivity());
        }

        UserInfo.getInstance().getCurrentPosition().setRadius(userRadius);UserInfo.getInstance().getCurrentPosition().setRadius(userRadius);
        UserInfo.getInstance().getCurrentPosition().setSpokenLanguages(languagesText);spokenLanguages.setText(languagesText);
        //Write to DB
        UserInfo.getInstance().updateUserInDB();UserInfo.getInstance().updateLocationInDB();
    }

    private String getDataFromTextInput(TextInputEditText input) {
        if (input != null) {
            Editable inputText = input.getText();
            if (inputText != null) {
                return inputText.toString();
            }
        }
        return "";
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (resultCode == RESULT_OK && requestCode == 1) {
            mImageUri = intent.getData();

            try {
                Picasso.get().load(mImageUri).into(userPhoto);
            }// this is where we change the image - so use upload file method here
            catch (IllegalArgumentException e){
                Log.e("FirebaseStorage", " Image not found !");
            }
        }
    }

    SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            // updated continuously as the user slides the thumb
            radiusValue.setText(progress + " m");
            userRadius = progress;
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // called when the user first touches the SeekBar
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // called after the user finishes moving the SeekBar
        }
    };

    public String getLanguagesText() {
        return languagesText;
    }

    public void onUserChange(String id){
        setUpInfos();
    }
}