Проверьте, является ли пользователь первым входом в приложение Android, используя Firebase Auth и Database - PullRequest
0 голосов
/ 06 января 2019

Я создаю приложение для чата и хочу сделать следующее:

При запуске MainActivity проверьте, вошел ли пользователь. Если нет, запустите FirebaseAuthUI.

Но FirebaseAuth поддерживает только несколько параметров, и, чтобы добавить больше, я создал узел базы данных для каждого пользователя, который хранит другие параметры. Чтобы получить эти параметры, после завершения FirebaseAuth пользователь перенаправляется в Activity, которая получает всю дополнительную информацию и хранит в узле пользователя в базе данных. Все это работает просто отлично.

Но после того, как пользователь заполнит информацию в этом информационном действии и завершит регистрацию, он должен вернуться к MainActivity и остаться там. Как я могу это сделать?

Я пытаюсь это так:

Я добавил каждому пользователю логическую переменную с именем userCompleted, которая сообщает, уже предоставил ли пользователь свою информацию. Я проверяю, является ли эта переменная ложной, и если да, я вызываю намерение Info Activity и, когда пользователь нажимает кнопку, чтобы завершить регистрацию в этом Activity, он устанавливает значение userCompleted в true для пользователя. узел в базе данных, а затем начать намерение, которое приводит к MainActivity.

Проблема в том, что в Базе данных userCompleted устанавливается на true, а затем сразу возвращается к false, и я не знаю почему. Кроме того, я думаю, что у меня возникают проблемы при чтении userCompleted из базы данных, возможно, из-за того, что я мало работал с асинхронными задачами.

Я использовал переменную isUserCompleted, объявленную в Main Activity, чтобы отслеживать значение userCompleted.

Был бы также полезен способ проверить, входит ли пользователь в первый раз, хотя это не решило бы всю мою проблему.

Это мой текущий код:

(если вам нужно больше, чтобы попытаться понять проблему, просто спросите в комментариях)

Создать AuthStateListener

public void setAuthStateListener(){
    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                onSignInInitialize(user);
                Log.d(TAG, "userUid = " + user.getUid());
                Toast.makeText(SearchActivity.this, "Signed in!", Toast.LENGTH_SHORT).show();
            } else {
                onSignOutCleanup();
                startLoginUI();
            }
        }
    };
}

onSignInInitialize ()

public void onSignInInitialize(final FirebaseUser user){
    mLoggedFBUser = user;
    mUserReference = mUsersDatabaseReference.child(user.getUid());
    mUserReference.child("uid").setValue(user.getUid());

    mUserReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            isUserCompleted = user.isUserCompleted();
            Log.d(TAG, "UserCompleted (onDataChanged) "+ isUserCompleted);
        }

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

        }
    });

    Log.d(TAG, "UserCompleted (Before startActivity if) "+ isUserCompleted);

    if (!isUserCompleted) {
        startCreateProfileActivity(user);
    }
    Log.d(TAG, "UserCompleted (After startActivity if) "+ isUserCompleted);

    mUserReference.child("username").setValue(user.getDisplayName());
    mUserReference.child("email").setValue(user.getEmail());

    attachChildEventListener();
}

Вернуться к основному занятию

mFinishButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mUserDatabaseReference.child("userCompleted").setValue(true);
            Intent intent = new Intent (CreateVolunteerProfile.this, SearchActivity.class);
            startActivity(intent);
        }
    });

Весь блок MainActivity (на самом деле он называется SearchActivity)

public class SearchActivity extends AppCompatActivity implements RecyclerAdapter.UserItemClickListener {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<User> users = new ArrayList<User>();

private String mLoggedUserId = "user2";
private String mLoggedUsername;
private User mLoggedUser;
private FirebaseUser mLoggedFBUser;
//private boolean isUserCompleted;

private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mPreferencesEditor;
private boolean firstTime = true;

private static final String TAG = "Search Activity";
private static final int USER_CLICK = 1;

private static final int RC_SIGN_IN = 1;
private static final int RC_CREATE_PROFILE = 2;

//Firebase
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mUsersDatabaseReference;
private DatabaseReference mUserReference;
private ChildEventListener mChildEventListener;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;

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

    View loadingView = findViewById(R.id.cl_loading);
    loadingView.setVisibility(View.VISIBLE);

    //RecyclerView
    recyclerView = findViewById(R.id.rv_users);
    recyclerView.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    adapter = new RecyclerAdapter(users, this);
    recyclerView.setAdapter(adapter);

    //Firebase
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mFirebaseAuth = FirebaseAuth.getInstance();
    mUsersDatabaseReference = mFirebaseDatabase.getReference().child("users");

    setAuthStateListener();

    loadingView.setVisibility(View.GONE);
}

@Override
protected void onResume() {
    super.onResume();
    mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}

@Override
protected void onPause() {
    super.onPause();
    if (mAuthStateListener != null)
        mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
    detachChildEventListener();
    clearAdapter();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    Log.wtf(TAG, "onSaveInstanceState userId = "+ mLoggedUserId);
    //Log.wtf(TAG, "UserCompleted (onSaveInstanceState) " + isUserCompleted);
    outState.putString("userId", mLoggedUserId);
    //outState.putBoolean("isUserCompleted", isUserCompleted);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    mLoggedUserId = savedInstanceState.getString("userId");
    //isUserCompleted = savedInstanceState.getBoolean("isUserCompleted");
    //Log.wtf(TAG, "UserCompleted (onRestoreInstanceState) " + isUserCompleted);
    Log.wtf(TAG, "onRestoreInstanceState userId = "+ mLoggedUserId);

}

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

    if((requestCode == RC_SIGN_IN) && firstTime){
        if (resultCode == RESULT_OK){
            //Toast.makeText(this, "Signed in!", Toast.LENGTH_SHORT).show();
        } else if (resultCode == RESULT_CANCELED){
            Toast.makeText(this, "Sign in canceled!", Toast.LENGTH_SHORT).show();
            finish();
        }
    }

    if((requestCode == RC_CREATE_PROFILE)){
        if (resultCode == RESULT_OK){
            //isUserCompleted = true;
        }
    }
}

@Override
public void onUserItemClick(int clickedUserIndex) {
    Intent intent = new Intent (this, ChatActivity.class);

    FirebaseUser user = mFirebaseAuth.getCurrentUser();

    if(user !=  null) {
        mLoggedUserId = user.getUid();
        intent.putExtra("user1", mLoggedUserId);

        String mUserRecieverId = users.get(clickedUserIndex).getUid();
        intent.putExtra("user2", mUserRecieverId);

        Log.wtf(TAG, "SearchActivity // user = " + users.get(clickedUserIndex));
        Log.wtf("1", "SearchActivity // mLoggedUserId = " + mLoggedUserId + " // users.getUid() = " + users.get(clickedUserIndex).getUid());

        startActivityForResult(intent, USER_CLICK);
    }
    else {
        Toast.makeText(this, "ERROR", Toast.LENGTH_SHORT).show();
    }

}

public void setAuthStateListener(){
    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                mUserReference = mUsersDatabaseReference.child(user.getUid());
                onSignInInitialize(user);

                Log.wtf(TAG, "userUid = " + user.getUid());

                Toast.makeText(SearchActivity.this, "Signed in!", Toast.LENGTH_SHORT).show();
            } else {
                onSignOutCleanup();
                startLoginUI();
            }
        }
    };
}

public void onSignInInitialize(final FirebaseUser user){
    mLoggedFBUser = user;
    mUserReference = mUsersDatabaseReference.child(user.getUid());
    mUserReference.child("uid").setValue(user.getUid());
    boolean isUserCompleted = false;

    mUserReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            isUserCompleted = user.isUserCompleted();
            Log.wtf(TAG, "UserCompleted (onDataChanged) "+ isUserCompleted);
        }

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

        }
    });

    Log.wtf(TAG, "UserCompleted (Before startActivity if) "+ isUserCompleted);

    if (!isUserCompleted) {
        startCreateProfileActivity(user);
    }
    Log.wtf(TAG, "UserCompleted (After startActivity if) "+ isUserCompleted);

    mUserReference.child("username").setValue(user.getDisplayName());
    mUserReference.child("email").setValue(user.getEmail());

    attachChildEventListener();
}

public void onSignOutCleanup(){
    mLoggedUser = null;
    mLoggedUserId = null;
    mLoggedUsername = null;
    detachChildEventListener();
    clearAdapter();
}

public void attachChildEventListener(){
    if (mChildEventListener == null){
        mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                User user = dataSnapshot.getValue(User.class);
                users.add(user);
                Log.d(TAG, "onChildAdded userId = "+ user.getUid());
                //adapter.notifyItemInserted(users.size()-1);
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) { }
            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) { }
            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) { }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { }
        };
    }

    mUsersDatabaseReference.addChildEventListener(mChildEventListener);
}

public void detachChildEventListener(){
    if (mChildEventListener != null){
        mUsersDatabaseReference.removeEventListener(mChildEventListener);
        mChildEventListener = null;
    }
}

public void clearAdapter() {
    final int size = users.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            users.remove(0);
        }
        adapter.notifyItemRangeRemoved(0, size);
    }
}

public void startCreateProfileActivity(FirebaseUser user){
    mUsersDatabaseReference.child(user.getUid()).child("userCompleted").setValue(false);
    Intent intent = new Intent(SearchActivity.this, CreateProfileActivity.class);
    intent.putExtra("userId", user.getUid());
    startActivityForResult(intent, RC_CREATE_PROFILE);
}

public void startLoginUI(){
    startActivityForResult(
            AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setIsSmartLockEnabled(false)
                    .setLogo(R.mipmap.logo)
                    .setAvailableProviders(Arrays.asList(
                            new AuthUI.IdpConfig.GoogleBuilder().build(),
                            //new AuthUI.IdpConfig.FacebookBuilder().build(),
                            //new AuthUI.IdpConfig.TwitterBuilder().build(),
                            //new AuthUI.IdpConfig.GitHubBuilder().build(),
                            new AuthUI.IdpConfig.EmailBuilder().build()))
                    //new AuthUI.IdpConfig.PhoneBuilder().build(),
                    //new AuthUI.IdpConfig.AnonymousBuilder().build()))
                    .build(),
            RC_SIGN_IN);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.search_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.sign_out_item:
            AuthUI.getInstance().signOut(this);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вот как вы можете это сделать. Создайте метод внутри вашей активности входа в систему.

 private void AllowUserToLogin() {
    String userName = userEmail.getText().toString();
    String userPass = userPassword.getText().toString();

    if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
        Toast.makeText(this, "Enter user Name / password first . . .", Toast.LENGTH_SHORT).show();
    } else {

        dialogBar.setTitle("Sign In ");
        dialogBar.setMessage("Please Wait . . .");
        dialogBar.setCanceledOnTouchOutside(true);
        dialogBar.show();

        mAuth.signInWithEmailAndPassword(userName, userPass)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        if (task.isSuccessful()) {
                            String currentUserID = mAuth.getCurrentUser().getUid();
                            String deviceToken = Settings.Secure.getString(getApplicationContext().getContentResolver(),
                                    Settings.Secure.ANDROID_ID);

                            UsersRef.child(currentUserID).child("device_token")
                                    .setValue(deviceToken)
                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {

                                            if(task.isSuccessful()){
                                                sendUserToMainActivity();
                                                Toast.makeText(LoginPage.this, "Logged in Successfull . . . ", Toast.LENGTH_SHORT).show();
                                                dialogBar.dismiss();
                                            }
                                        }
                                    });


                        } else {
                            String error = task.getException().toString();
                            Toast.makeText(LoginPage.this, "Wrong Email or Password: " + error, Toast.LENGTH_SHORT).show();
                            dialogBar.dismiss();
                        }
                    }
                });
    }
}

и метод onClick ().

@Override
public void onClick(View v) {

    if (v == needNewAccount) {
        sendUserToRegisterActivity();
    } else if (v == loginButton) {
        AllowUserToLogin();
    }else if(v == phone_button){
        Intent phoneLoginIntent = new Intent(LoginPage.this , PhoneLoginActivity.class);
        startActivity(phoneLoginIntent);

    }

}

это sendUserToRegisterActivity ()

private void sendUserToRegisterActivity() {
    Intent registerIntent = new Intent(LoginPage.this, RegisterationForm.class);
    startActivity(registerIntent);
}

Это sendUserToMainActivity ().

 private void sendUserToMainActivity() {
    Intent mainIntent = new Intent(LoginPage.this, MainActivity.class);
    mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(mainIntent);
    finish();
}
0 голосов
/ 06 января 2019

Я думаю, что самый простой способ - если пользователь нажал на финиш, Btn успешно установит флаг с true, иначе сделает его ложным

в вашем MainActivity

            firebase.auth().onAuthStateChanged(function(user) {

             // User signed in and not registered 
              if (user&&!isPressedOnFinishBtn) {
                // User is signed in.
              }
         user clicked on finish btn 
          else if(isPressedOnFinishBtn) {
                // No user is signed in.
              }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...