Как настроить макет деятельности в зависимости от типа / роли пользователя? - PullRequest
1 голос
/ 01 июня 2019

Я работаю над приложением для Android с двумя типами пользователей (врачами и пациентами) и хочу, чтобы у каждого типа был свой пользовательский интерфейс.Например, врачи должны увидеть «Добавить выходные», а пациенты - «Записаться на прием».Каким-то образом я ни к чему не обращаюсь.

Я также использую Firebase Auth и Realtime Database, что делает поиск типа пользователя довольно сложным.До сих пор я пробовал множество асинхронных классов, методов, переменных, общих настроек, извлекал данные, находясь на заставке запуска.

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

  1. У меня есть класс, расширяющий Application, который проверяет, есть ли пользователь, прошедший проверку подлинности, а затем перенаправляет пользователя либо в LoginActivity, либо в MainMenuActivity..

  2. Я создал метод, который извлекает пользовательские данные Firebase Auth из базы данных реального времени, циклически проходя по дочерним элементам «Доктора» и «Пациенты», пока не найдет текущее электронное письмо пользователя и не получит его тип.Поскольку база данных реального времени асинхронна, методы получают интерфейс в качестве аргумента, и после цикла я вызываю метод интерфейса, который устанавливает статическую логическую переменную (isUserDoctor).

  3. Донастраивая представление контента (с двумя возможными макетами), я вызываю функцию, описанную выше, и она работает так, как я упоминал вначале, что не очень хорошо.

Метод, который извлекает данные

 public void getUserType(final DataStatus dataStatus) {

        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        currentUserEmail = currentUser.getEmail();

        databaseReference = FirebaseDatabase.getInstance().getReference("Users");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                currentUserType.clear();
                FirebaseManager.isUserDoctor = false;

                DataSnapshot allDoctors = dataSnapshot.child("Doctors");
                DataSnapshot allPatients = dataSnapshot.child("Patients");

                for (DataSnapshot ds : allDoctors.getChildren()) {

                    if (currentUserEmail.equals(Utils.decodeUserEmail(ds.getKey()))) {

                        currentUserType.add(ds.child("userType").getValue().toString());

                    } else {

                        for (DataSnapshot dsPacient : allPatients.getChildren()) {
                            if (currentUserEmail.equals(Utils.decodeUserEmail(dsPacient.getKey()))) {
                                currentUserType.add(dsPacient.child("userType").getValue().toString());
                            }
                        }
                    }
                }


                dataStatus.DataIsLoaded(currentUserType.get(0).toString());

            }

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

            }
        });

Интерфейс

public interface DataStatus {

    void DataIsLoaded(String userType);

}

Вызов метода в главном меню

FirebaseManager.getInstance().getUserType(new DataStatus() {
            @Override
            public void DataIsLoaded(String userType) {
                if ("doctor".equals(userType))
                    FirebaseManager.isUserDoctor = true;
                else
                    FirebaseManager.isUserDoctor = false;
            }
        });


        if (FirebaseManager.isUserDoctor)
            setContentView(R.layout.activity_main_menu_doctor);
        else
            setContentView(R.layout.activity_main_menu);

Так что если у кого-то есть идеи о том, как показать правильную компоновку и разрешить функции на основена роль пользователя / тип пожалуйста поделитесь.В основном мне нужно как раз вовремя извлечь userType из текущего письма, чтобы установить переменную, необходимую во всем приложении, чтобы скрыть / показать определенные представления.

...