SDPepe/AppArt

View on GitHub
app/src/main/java/ch/epfl/sdp/appart/SimpleUserProfileActivity.java

Summary

Maintainability
A
0 mins
Test Coverage
D
64%
package ch.epfl.sdp.appart;

import static android.widget.Toast.makeText;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;
import android.util.Pair;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import ch.epfl.sdp.appart.utils.PermissionRequest;
import javax.inject.Inject;

import androidx.lifecycle.ViewModelProvider;

import com.bumptech.glide.Glide;

import java.util.List;

import ch.epfl.sdp.appart.database.DatabaseService;
import ch.epfl.sdp.appart.database.local.LocalDatabaseService;
import ch.epfl.sdp.appart.glide.visitor.GlideImageViewLoader;
import ch.epfl.sdp.appart.user.User;
import ch.epfl.sdp.appart.user.UserViewModel;
import ch.epfl.sdp.appart.utils.ActivityCommunicationLayout;
import dagger.hilt.android.AndroidEntryPoint;

@AndroidEntryPoint
public class SimpleUserProfileActivity extends AppCompatActivity {

    /* temporary user */
    private Pair<User, Boolean> advertiserUser;

    /* User ViewModel */
    UserViewModel mViewModel;

    @Inject
    DatabaseService database;
    @Inject
    LocalDatabaseService localdb;

    /* UI components */
    private EditText nameText;
    private EditText ageText;
    private EditText phoneNumberText;
    private EditText genderText;
    private TextView uniAccountClaimer;
    private TextView emailTextView;
    private ImageView imageView;
    private Button contactButton;

    private final static int PHONE_CALL_PERMISSION_CODE = 123;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_user_profile);

        /* User ViewModel initialization */
        mViewModel = new ViewModelProvider(this).get(UserViewModel.class);


        /* UI components initialisation */
        this.nameText = findViewById(R.id.name_SimpleUserProfile_editText);
        this.ageText = findViewById(R.id.age_SimpleUserProfile_editText);
        this.emailTextView = findViewById(R.id.emailText_SimpleUserProfile_textView);
        this.phoneNumberText = findViewById(R.id.phoneNumber_SimpleUserProfile_editText);
        this.genderText = findViewById(R.id.gender_SimpleUserProfile_editText);
        this.uniAccountClaimer = findViewById(R.id.uniAccountClaimer_SimpleUserProfile_textView);
        this.imageView = findViewById(R.id.profilePicture_SimpleUserProfile_imageView);
        contactButton = findViewById(R.id.contact_SimpleUserProfile_button);

        contactButton.setVisibility(View.INVISIBLE);
        String advertiserId =
                getIntent().getStringExtra(ActivityCommunicationLayout.PROVIDING_USER_ID);

        /* get user from database from user ID */
        mViewModel.getUser(advertiserId)
                .exceptionally(e -> {
                    Log.d("SIMPLEUSER", "Failed to get the user");
                    return null;
                });
        mViewModel.getUser().observe(this, this::setAdUserToLocal);
    }

    /**
     * Contact announcer.
     */
    public void openEmailOrPhone(View view){
        if(!advertiserUser.first.getPhoneNumber().isEmpty()) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("How did you prefer contact the announcer ?");
            builder.setPositiveButton("Contact via Email", (dialog, which) -> onEmail());
            builder.setNeutralButton("Contact via phone number", (dialog, which) -> onCall());
            AlertDialog dialog = builder.create();
            dialog.show();
        } else {
            onEmail();
        }
    }

    private void onEmail() {


        Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:"));
        intent.putExtra(Intent.EXTRA_EMAIL,  new String[]{advertiserUser.first.getUserEmail()});
        intent.putExtra(Intent.EXTRA_SUBJECT, "Rent apartment");
        try {
            startActivity(intent);
        } catch (Exception e) {
            makeText(this, "Error open email, try again",Toast.LENGTH_SHORT).show();
        }
    }
    private void onCall() {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                this,
                new String[]{Manifest.permission.CALL_PHONE},
                    PHONE_CALL_PERMISSION_CODE);
        } else {
            startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:"+advertiserUser.first.getPhoneNumber())));
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PHONE_CALL_PERMISSION_CODE:
                if(PermissionRequest.checkPermission(grantResults)){
                    onCall();
                }else{
                    makeText(this, "Permission Not Granted",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }
    

    /**
     * @param user sets the value of the current user to the session user object
     */
    private void setAdUserToLocal(Pair<User, Boolean> user) {
        this.advertiserUser = user;
        contactButton.setVisibility(View.VISIBLE);
        /* set attributes of session user to the UI components */
        getAndSetCurrentAttributes();
    }

    /**
     * sets the current session User attributes to the UI components
     */
    private void getAndSetCurrentAttributes() {

        User user = this.advertiserUser.first;

        this.nameText.setText(user.getName());
        this.emailTextView.setText(user.getUserEmail());
        this.uniAccountClaimer.setText((user.hasUniversityEmail() ?
                getString(R.string.uniAccountClaimer) : getString(R.string.nonUniAccountClaimer)));
        if (user.getAge() != 0) {
            this.ageText.setText(String.valueOf(user.getAge()));
        }
        if (user.getPhoneNumber() != null) {
            this.phoneNumberText.setText(user.getPhoneNumber());
        }
        if (user.getGender() != null) {
            this.genderText.setText(user.getGender());
        }
        setPictureToImageComponent();
    }

    /**
     * sets the user profile picture (or default gender picture) to the ImageView component
     */
    private void setPictureToImageComponent() {


        boolean isLocal = this.advertiserUser.second;
        if(isLocal) {
            Bitmap profilePic = BitmapFactory.decodeFile(this.advertiserUser.first.getProfileImagePathAndName());
            Glide.with(this).load(profilePic).into(imageView);
        } else {
            database.accept(new GlideImageViewLoader(this, imageView,
                    this.advertiserUser.first.getProfileImagePathAndName()));
        }
    }

}