1

I am creating a chat app. users can change their info. after making a new account, they have to create their profile. the profile activity restarts itself again and again. can I fix it or It is an Android problem

I have tried everything at here!

settingsActivity.java:

package com.satyamedh.chitchatmessenger;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Objects;

import de.hdodenhof.circleimageview.CircleImageView;

public class SettingsActivity extends AppCompatActivity {

    private Button Updatebutton;
    private EditText Username, Status;
    private CircleImageView profileImage;

    private String currentUID;
    private DatabaseReference rootref;

    private StorageReference ProfileImagesRef;

    private String downloadUrl;

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

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);



        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
            {
                final CropImage.ActivityResult result = CropImage.getActivityResult(data);

                if(resultCode == RESULT_OK)
                {
                    Uri resultUri = result.getUri();

                    final StorageReference ref = ProfileImagesRef.child(currentUID + ".jpg");

                    ref.putFile(resultUri)
                            .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {


                                    ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                        @Override
                                        public void onSuccess(Uri uri)
                                        {
                                            Toast.makeText(SettingsActivity.this, uri.toString(), Toast.LENGTH_SHORT).show();
                                            downloadUrl = uri.toString();

                                            rootref.child("Users").child(currentUID).child("image")
                                                    .setValue(downloadUrl)
                                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task)
                                                        {
                                                            if(task.isSuccessful())
                                                            {
                                                                Toast.makeText(SettingsActivity.this, "Profile Image Uploaded Successfully...", Toast.LENGTH_SHORT).show();
                                                            }
                                                            else
                                                            {
                                                                Toast.makeText(SettingsActivity.this, "Some error has occurred, please try again later...", Toast.LENGTH_SHORT).show();
                                                            }
                                                        }
                                                    });

                                        }
                                    });


                                }



                            });

                }

            }


        }


    private void getUserInfo()
    {
        rootref.child("Users").child(currentUID)
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            String oldImage;
                            if(dataSnapshot.hasChild("name") && (dataSnapshot.hasChild("status"))) {
                                String oldUsername = dataSnapshot.child("name").getValue().toString();
                                String oldStatus = dataSnapshot.child("status").getValue().toString();
                                Username.setText(oldUsername);
                                Status.setText(oldStatus);
                            }

                            if (dataSnapshot.hasChild("image"))
                            {
                                oldImage = dataSnapshot.child("image").getValue().toString();
                                Picasso.get().load(oldImage).placeholder(R.drawable.profile_image).into(profileImage);

                            }








                            Toast.makeText(SettingsActivity.this, "Please update your profile", Toast.LENGTH_SHORT).show();



                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
    }


    private void updateSettings()
    {
        String setUserName = Username.getText().toString();
        String setStatus = Status.getText().toString();


        if (TextUtils.isEmpty(setUserName))
        {
            Toast.makeText(this, "Please enter Username to continue", Toast.LENGTH_SHORT).show();
        }
        if (TextUtils.isEmpty(setStatus))
        {
            Toast.makeText(this, "Please enter Status to continue", Toast.LENGTH_SHORT).show();
        }
        else
        {
            HashMap<String, String> profileMap = new HashMap<>();
            profileMap.put("uid", currentUID);
            profileMap.put("name", setUserName);
            profileMap.put("status", setStatus);

            rootref.child("Users").child(currentUID).setValue(profileMap)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful())
                            {
                                Toast.makeText(SettingsActivity.this, "Profile updated successfully", Toast.LENGTH_SHORT).show();
                                askUserToUseApp();
                            }

                            else
                            {
                                String messegess = task.getException().toString();
                                Toast.makeText(SettingsActivity.this, "Error : " + messegess, Toast.LENGTH_SHORT).show();
                            }
                        }
                    });

        }
    }

    @Override
    protected void onStart() {
        super.onStart();



        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        currentUID = Objects.requireNonNull(mAuth.getCurrentUser()).getUid();
        rootref = FirebaseDatabase.getInstance().getReference();
        ProfileImagesRef = FirebaseStorage.getInstance().getReference().child("Profile images");


        initializeFields();

        Updatebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateSettings();
            }
        });

        getUserInfo();



        profileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                CropImage.activity()
                        .setGuidelines(CropImageView.Guidelines.ON)
                        .start(SettingsActivity.this);
            }
        });
        updateUserStatus("online");

    }

    private void initializeFields()
    {
        Updatebutton = findViewById(R.id.update_settings);
        Username = findViewById(R.id.set_user_name);
        Status = findViewById(R.id.set_status);
        profileImage = findViewById(R.id.set_profile_image);

    }


    private void askUserToUseApp() {


        Intent loginIntent = new Intent(SettingsActivity.this, MainActivity.class);
        loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(loginIntent);
        finish();

    }

    @Override
    protected void onStop()
    {
        super.onStop();



        updateUserStatus("offline");



    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();


        updateUserStatus("offline");



    }


    private void updateUserStatus(String state)
    {
        Calendar calForDate =  Calendar.getInstance();
        @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM, yyyy");
        String  currentDate =  simpleDateFormat.format(calForDate.getTime());

        Calendar calForTime =  Calendar.getInstance();
        @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("hh:mm:ss a");
        String  currentTime =  simpleTimeFormat.format(calForTime.getTime());

        HashMap<String, Object> onlineState = new HashMap<>();
        onlineState.put("time", currentTime);
        onlineState.put("date", currentDate);
        onlineState.put("state", state);

        rootref.child("Users").child(currentUID).child("userState")
                .updateChildren(onlineState);


    }


}

there are no errors. but I can stop it by uninstalling it using ADB

Edit: it works fine after I edit it manually edit in firebase and then open that activity from the main activity.

Edit2: registerActivity.java

package com.satyamedh.chitchatmessenger;

import android.app.ProgressDialog;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;

public class ResigsterActivity extends AppCompatActivity {

    private Button registerButton;
    private EditText userEmail, userPassword;
    private TextView loginactivityLink;

    private FirebaseAuth mAuth;
    private DatabaseReference rootref;

    private ProgressDialog loading_bar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_resigster);
        FirebaseApp.initializeApp(this);

        mAuth = FirebaseAuth.getInstance();
        rootref = FirebaseDatabase.getInstance().getReference();

        MobileAds.initialize(this, "ca-app-pub-3127817354023186~6842500243");

        final AdView mAdView;

        mAdView = findViewById(R.id.register_banner_ad);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
        mAdView.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                // Code to be executed when an ad finishes loading.
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                // Code to be executed when an ad request fails.
            }

            @Override
            public void onAdOpened() {
                // Code to be executed when an ad opens an overlay that
                // covers the screen.
            }

            @Override
            public void onAdClicked() {



                // Code to be executed when the user clicks on an ad.
            }

            @Override
            public void onAdLeftApplication() {
                // Code to be executed when the user has left the app.
            }

            @Override
            public void onAdClosed() {
                // Code to be executed when the user is about to return
                // to the app after tapping on an ad.
            }
        });


        initializeFields();

        loginactivityLink.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                askUserToLogin();
            }
        });

        registerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createAccount();
            }
        });


    }

    private void createAccount()
    {
        final String email = userEmail.getText().toString();
        final String password = userPassword.getText().toString();

        if (TextUtils.isEmpty(email))
        {
            Toast.makeText(this, "Please enter Email...", Toast.LENGTH_SHORT).show();
        }

        if (TextUtils.isEmpty(password))
        {
            Toast.makeText(this, "Please enter Password...", Toast.LENGTH_SHORT).show();
        }

        else
        {

            loading_bar.setTitle("Creating new account");
            loading_bar.setMessage("Please wait...");
            loading_bar.setCanceledOnTouchOutside(true);
            loading_bar.show();

            mAuth.createUserWithEmailAndPassword(email, password)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                            if(task.isSuccessful())
                            {


                                final String currentUserID = mAuth.getCurrentUser().getUid();
                                rootref.child("Users").child(currentUserID).setValue("");
                                final String[] deviceToken = new String[1];

                                FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                                    @Override
                                    public void onSuccess(InstanceIdResult instanceIdResult) {
                                        deviceToken[0] = instanceIdResult.getToken();
                                        // Do whatever you want with your token now
                                        // i.e. store it on SharedPreferences or DB
                                        // or directly send it to server



                                        rootref.child("Users").child(currentUserID).child("device_token").setValue(deviceToken[0]).addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task)
                                            {
                                                if (task.isSuccessful())
                                                {
                                                    Toast.makeText(ResigsterActivity.this, "Account created successfully...", Toast.LENGTH_SHORT).show();
                                                    loading_bar.dismiss();
                                                    mAuth.signInWithEmailAndPassword(email, password);
                                                    askUserToMain();
                                                }

                                            }
                                        });

                                        rootref.child("Users").child(currentUserID).child("image").setValue("https://firebasestorage.googleapis.com/v0/b/chit-chat-web-chat.appspot.com/o/profile_image.png?alt=media&token=12bc53c2-c27d-420f-9d5f-f84c22a6449c");
                                        rootref.child("Users").child(currentUserID).child("name").setValue("Enter your name here");
                                        rootref.child("Users").child(currentUserID).child("status").setValue("Enter your status here");

                                    }
                                });


                            }

                            else
                            {
                                String messegess = task.getException().toString();
                                Toast.makeText(ResigsterActivity.this, "Error : " + messegess, Toast.LENGTH_SHORT).show();
                                loading_bar.dismiss();
                            }
                        }
                    });
        }

    }

    private void initializeFields()
    {

        registerButton = (Button) findViewById(R.id.register_button);
        userEmail = (EditText) findViewById(R.id.register_email);
        userPassword = (EditText) findViewById(R.id.register_password);
        loginactivityLink = (TextView) findViewById(R.id.register_sign_in);
        loading_bar = new ProgressDialog(this);

    }

    private void askUserToLogin() {


        Intent loginIntent = new Intent(ResigsterActivity.this, LoginActivity.class);
        loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(loginIntent);
        finish();

    }

    private void askUserToMain() {


        Intent mainIntent = new Intent(ResigsterActivity.this, ProfileActivity.class);
        mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(mainIntent);
        finish();

    }


    private void askUserToUseApp() {


        Intent loginIntent = new Intent(ResigsterActivity.this, LoginActivity.class);
        loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(loginIntent);
        finish();

    }

}

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
satyamedh
  • 47
  • 1
  • 12

1 Answers1

0

Might be not related answer but whenever you are using any firebase or firestore event try to pass "this("activity context")" as the first parameter it will manage the activity life cycle and will remove you listener when your app will be in background.

haresh
  • 1,424
  • 2
  • 12
  • 18