Firestore, как получить данные из пожарного магазина в представлении переработчика - PullRequest
1 голос
/ 16 марта 2019

Фон

Мое приложение позволяет пользователям публиковать изображения в определенных категориях, а затем позволяет пользователям нажимать на сообщения, чтобы вызвать функцию обмена сообщениями

Задача

В настоящее время он настроен таким образом, что это глобальный чат (любой пользователь мог присоединиться, и он был одинаковым для всех сообщений, читающих и пишущих из одного и того же документа) для целей тестирования, но я хочу, чтобы он был личным чатом. между двумя пользователями. Это было создано с использованием базы данных в реальном времени, в которой я нахожусь в процессе миграции в Firestore, поэтому мне также придется изменить код для "chatActivity"

Что я сделал

Когда сообщение создается, оно добавляет новый документ в коллекцию сообщений для этого сообщения. Имя документа сообщений, связанное с этим сообщением, затем сохраняется в сообщении.

Где я застрял

В чате я должен иметь возможность получить идентификатор сообщения, чтобы затем получить местоположение документа, содержащего сообщения, связанные с этим сообщением

Цель

Чтобы пользователи могли публиковать изображения и иметь документ в коллекции «Сообщения», они ДОЛЖНЫ быть созданы, чтобы второй пользователь пришел и увидел, что упомянутое изображение коснулось его, а затем смог открыть тот документ, который был создан для изображения, чтобы два пользователя могли затем обмениваться сообщениями друг с другом, делая его закрытым для двух пользователей, потому что они читают только из документа, связанного с этим сообщением

рабочий процесс приложения это должно устранить любую путаницу

База данных: database

Код для записи поста в базу данных:

filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    final String downloadUrl =
                                            uri.toString();
                                    Log.d("tag", downloadUrl);

                                    FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
                                    String uid = Objects.requireNonNull(current_user).getUid();

                                    final Map<String, Object> postMap = new HashMap<>();
                                    // No thumb ?????
                                    postMap.put("image_url", downloadUrl);
                                    postMap.put("desc", desc);
                                    postMap.put("user_id", current_user_id);
                                    postMap.put("message Doc", uid + postCategory);
                                    postMap.put("timestamp", FieldValue.serverTimestamp());


                                    firebaseFirestore.collection(postCategory).add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                                        @Override
                                        public void onComplete(@NonNull Task<DocumentReference> task) {

                                            if (task.isSuccessful()) {

                                                firebaseFirestore.collection("Posts").add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<DocumentReference> task) {

                                                        FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
                                                        String uid = Objects.requireNonNull(current_user).getUid();

                                                        final Map<String, String> chatMap = new HashMap<>();
                                                        postMap.put("timestamp", FieldValue.serverTimestamp());
                                                        postMap.put("name", current_user_id);
                                                        postMap.put("message", "");

                                                        firebaseFirestore.collection("Messages")
                                                                .document(uid + postCategory)
                                                                .set(chatMap)
                                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                                    @Override
                                                                    public void onSuccess(Void aVoid) {

                                                                    }
                                                                });

Код для чата

public class ChatActivity extends AppCompatActivity {

    public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
    private static final int GALLERY_PICK = 1;

    private ListView mMessageListView;
    private MessageAdapter mMessageAdapter;// This is to do with the file messageadapter\
    private ProgressBar mProgressBar;
    private ImageButton mPhotoPickerButton;
    private EditText mMessageEditText;
    private Button mSendButton;
    private String mUsername;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mMessagedatabaseReference;
    private ChildEventListener mChildEventListner;
    private ValueEventListener mValueEventListner;
    private FirebaseUser mCurrentUser;
    private FirebaseStorage mFirebaseStorage;
    private ProgressDialog mProgressDialog;
    private StorageReference mChatPhotosStorageReference;

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

        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mMessagedatabaseReference = mFirebaseDatabase.getReference().child("messages");


        //new shit

        // Map<String, Object> usersChat = new HashMap<>();
        // usersChat.put("user 1 id", mCurrentUser);
        // usersChat.put("user2Id", )





        mFirebaseStorage = FirebaseStorage.getInstance();
        mChatPhotosStorageReference = mFirebaseStorage.getReference().child("chat_photos");

        // Initialize references to views
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mMessageListView = (ListView) findViewById(R.id.messageListView);
        mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
        mMessageEditText = (EditText) findViewById(R.id.messageEditText);
        mSendButton = (Button) findViewById(R.id.sendButton);

        mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
        final String current_uid = mCurrentUser.getUid();

        // Initialize progress bar
        mProgressBar.setVisibility(ProgressBar.INVISIBLE);

        //Initialize message ListView and its adapter
        List<FriendlyMessage> friendlyMessages = new ArrayList<>();
        mMessageAdapter = new MessageAdapter(this, R.layout.item_message, friendlyMessages);
        mMessageListView.setAdapter(mMessageAdapter);

        // ImagePickerButton shows an image picker to upload a image for a message
        mPhotoPickerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent galleryIntent = new Intent();
                galleryIntent.setType("image/*");
                galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

                startActivityForResult(Intent.createChooser(galleryIntent, "Select Image"), GALLERY_PICK);
            }
        });

        // Enable Send button when there's text to send
        mMessageEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (charSequence.toString().trim().length() > 0) {
                    mSendButton.setEnabled(true);
                } else {
                    mSendButton.setEnabled(false);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });
        mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});

        // Send button sends a message and clears the EditText
        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString());
                mMessagedatabaseReference.push().setValue(friendlyMessage);

                // Clear input box
                mMessageEditText.setText("");
            }
        });

        mChildEventListner = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
                mMessageAdapter.add(friendlyMessage);

            }

            @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) {

            }
        };
        mMessagedatabaseReference.addChildEventListener(mChildEventListner);

        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString(), current_uid, null);
                mMessagedatabaseReference.push().setValue(friendlyMessage);

                // Clear input box
                mMessageEditText.setText("");
            }
        });

    }

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

        if (requestCode == GALLERY_PICK && resultCode == RESULT_OK) {

            Uri selectedImageUri = data.getData();

            final StorageReference photoRef = mChatPhotosStorageReference.child(selectedImageUri.getLastPathSegment());

            photoRef.putFile(selectedImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    photoRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            String downloadUrl = uri.toString();
                            Log.d("tag", downloadUrl);
                            FriendlyMessage friendlyMessage = new FriendlyMessage(null, mUsername, downloadUrl);
                            mMessagedatabaseReference.push().setValue(friendlyMessage);
                        }
                    });
                }
            });

        }
    }

1 Ответ

1 голос
/ 17 марта 2019

Где я застрял

В своей активности в чате, Мне нужно иметь возможность получить идентификатор сообщения, чтобы я Затем можно получить местоположение документа, содержащего сообщения связанные с этим постом

Я не уверен, вы хотите получить все идентификаторы или только один идентификатор?

Если вы хотите получить документ ALL id из коллекции music из магазина, пожалуйста, добавьте это в свой код:

public void loadAlltQueries(){
 Query loadAllQueryId = firebaseFirestore
                       .collection("music")
                       .orderBy("timestamp", Query.Direction.DESCENDING);

  loadAllQueryId.addSnapshotListener(new EventListener<QuerySnapshot>(){
    @Override
    public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e){


     for (DocumentChange doc : documentSnapshots.getDocumentChanges()){

       if (doc.getType() == DocumentChange.Type.ADDED){

          String musicId = doc.getDocument().getId();
          FriendlyMessage friendlyMessage = doc.getDocument().toObject(FriendlyMessage.class).withId(musicId);                        

          mMessageAdapter.add(friendlyMessage);                                                                       

          mMessageAdapter.notifyDataSetChanged(); //for update adapter
        }
     }

    }
  });
}

и make MusicId.class

public class MusicId{

    @Exclude
    public String MusicId;

    public <T extends MusicId> T withId(@NonNull final String id) {

        this.MusicId = id;
        return (T) this;
    }

}

не забудьте добавить это в Ваш FriendlyMessage.class

public class FriendlyMessage extends MusicId {

// your constructor
// your getter

}

и из вашего класса адаптеров получите ваш геттер

 final String musicId = contentList.get(position).MusicId;

и теперь вы получите свой идентификатор CHur40Nr ..

если вы хотите получить идентификатор поста, который соответствует любому посту, выбранному из представления переработчика. Пожалуйста, сделайте класс Адаптера, потому что метод holder получит ваше сообщение, которое вы выбрали в этом случае держатель для holder.setMessage(message);

public class AdapterFriendlyMessage extends RecyclerView.Adapter<FriendlyMessage.ViewHolder> {

    public List<FriendlyMessage> contentList;
    public Context context;

    private FirebaseFirestore firebaseFirestore;
    private FirebaseAuth firebaseAuth;

    public AdapterFriendlyMessage(List<FriendlyMessage> contentList){
        this.contentList = contentList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_friendly_message, parent, false);
        context = parent.getContext(); FriendlyMessage(container.getContext(), contentList);

        firebaseFirestore = FirebaseFirestore.getInstance();
        firebaseAuth = FirebaseAuth.getInstance();

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.setRecyclable(false);

        // GET MusicId
        final String  musicId = contentList.get(position). MusicId;
        final String currentUserId = firebaseAuth.getCurrentUser().getUid();   


        String uid = contentList.get(position).getUid();
        firebaseFirestore.collection(" Music").document( musicId).collection("FriendlyMessage").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>(){
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task){

                if (task.isSuccessful()) {

                    String message = task.getResult().getString("message");
                    holder.setMessage(message); // this is what you want
                } 
            }
        });       
    }

    @Override
    public int getItemCount() {
        return contentList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private View mView;    

        private TextView txtMessage;           

        public ViewHolder(View itemView){
            super(itemView);
            mView = itemView;   

        }

            public void setMessage(Sting text) {

                txtMessage = mView.findViewById(R.id.text_view_mesage);
                txtMessage.setText(text);
            }


    }
}

не забудьте передать id из firestore в Adapter открытый класс FriendlyMessageRoom расширяет фрагмент {

private RecyclerView recyclerMessage;
private List<FriendlyMessage > contentList;
private AdapterFriendlyMessage adapterFriendlyMessage;        

private FirebaseFirestore firebaseFirestore;
private FirebaseAuth mAuth;



public FriendlyMessageRoom() {
    // Required empty public constructor
}

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


    mAuth = FirebaseAuth.getInstance();
    firebaseFirestore = FirebaseFirestore.getInstance();

    contentList = new ArrayList<>();
    recyclerMessage = view.findViewById(R.id.recycler_message);
    adapterFriendlyMessage = new AdapterFriendlyMessage(contentList);
    recyclerMessage.setLayoutManager(new LinearLayoutManager(container.getContext()));
    recyclerMessage.setAdapter(adapterFriendlyMessage);

    return view;
}

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

    loadAlltQueries(); // please see firebase query that i write above
}

ПРИМЕЧАНИЕ: мой ответ может не дать точного ответа на ваш вопрос, так как трудно представить, что вы хотите в описании проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...