简体   繁体   中英

In-App notifications without server side coding in Firebase

I am developing an e-commerce android application in which i have two sides(admin side and user side). I have implemented in-app messaging in my application where user can send message to admin and admin can send message to user. Now, i want to add notifications to this part that when a admin or user sends message the other side receives notification if it is in the app because i want to do this without server side code. I tried googling it but couldn't find any good solution. So can anyone help? Here is my chat class for user:

chat_messages_view_panel = (LinearLayout)findViewById(R.id.chat_messages_view_panel);
    chat_messages_scroll_view = (ScrollView)findViewById(R.id.chat_messages_scroll_view);

    chatImagesRef = FirebaseStorage.getInstance().getReference().child("Chat Images");


    FirebaseDatabase.getInstance().getReference().child("Admins").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for(DataSnapshot item : snapshot.getChildren()) {
                admin = item.getValue(Admin.class);
                break;
            }
            loadMessages();
        }

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

        }
    });

    FirebaseDatabase.getInstance().getReference().child("Messages").child(Prevelent.onlineUser.getEmail()).
            addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot)
                {
                    for(DataSnapshot item: snapshot.getChildren())
                    {
                        Message message = item.getValue(Message.class);
                        if(!message_ids.contains(message.getId()))
                        {
                            message_ids.add(message.getId());
                            addMessage(message);
                        }
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });

    sendButton = (ImageButton)findViewById(R.id.sendMessage);
    messageContent = (EditText)findViewById(R.id.chat_message_box);
    sendPictureButton = (ImageButton) findViewById(R.id.uploadImage);
    loadingBar = new ProgressDialog(this);


    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(messageContent.getText().toString().equals("")){
                return;
            }

            Calendar calendar = Calendar.getInstance();

            SimpleDateFormat currentDate = new SimpleDateFormat("yyyy MM, dd");
            String saveCurrentDate = currentDate.format(calendar.getTime());

            SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm:ss:SSS a");
            String saveCurrentTime = currentTime.format(calendar.getTime());

            DatabaseReference messageRef = FirebaseDatabase.getInstance().getReference();

            Map<String, Object> userdataMap = new HashMap<>();
            userdataMap.put("id", Prevelent.onlineUser.getEmail() + " : " + saveCurrentDate + " " + saveCurrentTime);
            userdataMap.put("content", messageContent.getText() + "");
            userdataMap.put("sentByEmail", Prevelent.onlineUser.getEmail());
            userdataMap.put("sentByName", Prevelent.onlineUser.getName());
            userdataMap.put("sentToEmail", admin.getEmail());
            userdataMap.put("sentToName", admin.getName());
            userdataMap.put("sentAt", saveCurrentDate + " " + saveCurrentTime);
            userdataMap.put("messageType", "text");
            messageRef.child("Messages").child(Prevelent.onlineUser.getEmail()).child(saveCurrentDate + " " + saveCurrentTime).
                    updateChildren(userdataMap)
                    .addOnCompleteListener(new OnCompleteListener<Void>(){
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            messageContent.setText("");
                        }
                    });
        }
    });

    sendPictureButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            OpenGallery();
        }
    });
}

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

    if (requestCode==GalleryPick  &&  resultCode==RESULT_OK  &&  data!=null)
    {
        ImageUri = data.getData();
        AlertDialog.Builder alertadd = new AlertDialog.Builder(chatActivity.this);
        LayoutInflater factory = LayoutInflater.from(chatActivity.this);
        final View view = factory.inflate(R.layout.alertdialog_imageview_layout, null);
        ImageView imageView = view.findViewById(R.id.dialog_imageview);
        imageView.setImageURI(ImageUri);
        alertadd.setView(view);
        alertadd.setCancelable(false);
        alertadd.setPositiveButton("Upload", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dlg, int sumthin) {
                loadingBar.setTitle("Picture Upload");
                loadingBar.setMessage("Please wait while your image is being uploaded");
                loadingBar.setCanceledOnTouchOutside(false);
                loadingBar.show();
                UploadImage();
                dlg.dismiss();
            }
        });
        alertadd.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dlg, int sumthin) {
                dlg.dismiss();
            }
        });
        alertadd.show();
    }
}

public void UploadImage(){
    Calendar calendar = Calendar.getInstance();

    SimpleDateFormat currentDate = new SimpleDateFormat("yyyy MM, dd");
    saveCurrentDate = currentDate.format(calendar.getTime());

    SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm:ss:SSS a");
    saveCurrentTime = currentTime.format(calendar.getTime());

    pictureRandomKey = saveCurrentDate + saveCurrentTime;

    final StorageReference filePath = chatImagesRef.child(ImageUri.getLastPathSegment() + pictureRandomKey + ".jpg");

    final UploadTask uploadTask = filePath.putFile(ImageUri);

    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e)
        {
            String message = e.toString();
            Toast.makeText(chatActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
        {
            loadingBar.cancel();
            Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception
                {
                    if (!task.isSuccessful())
                    {
                        throw task.getException();
                    }

                    downloadImageUrl = filePath.getDownloadUrl().toString();
                    return filePath.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task)
                {
                    if (task.isSuccessful())
                    {
                        downloadImageUrl = task.getResult().toString();

                        DatabaseReference messageRef = FirebaseDatabase.getInstance().getReference();

                        Map<String, Object> userdataMap = new HashMap<>();
                        userdataMap.put("id", Prevelent.onlineUser.getEmail() + " : " + saveCurrentDate + " " + saveCurrentTime);
                        userdataMap.put("content", downloadImageUrl);
                        userdataMap.put("sentByEmail", Prevelent.onlineUser.getEmail());
                        userdataMap.put("sentByName", Prevelent.onlineUser.getName());
                        userdataMap.put("sentToEmail", admin.getEmail());
                        userdataMap.put("sentToName", admin.getName());
                        userdataMap.put("sentAt", saveCurrentDate + " " + saveCurrentTime);
                        userdataMap.put("messageType", "picture");
                        messageRef.child("Messages").child(Prevelent.onlineUser.getEmail()).child(saveCurrentDate + " " + saveCurrentTime).
                                updateChildren(userdataMap)
                                .addOnCompleteListener(new OnCompleteListener<Void>(){
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        messageContent.setText("");
                                    }
                                });
                    }
                }
            });
        }
    });
}

private void addMessage(Message message)
{
    if(message.getMessageType().equals("text")){
        if(message.getSentByEmail().equals(Prevelent.onlineUser.getEmail()))
        {
            addMyMessage(message);
        }
        else
        {
            addTheirMessage(message);
        }
    }else{
        int id = View.generateViewId();
        imagesUrl.put(id, message.getContent());
        if(message.getSentByEmail().equals(Prevelent.onlineUser.getEmail()))
        {
            addMyMessageImage(message, id);
        }
        else
        {
            addTheirMessageImage(message, id);
        }
    }
}

private void addTheirMessageImage(Message message, int id) {

    try {
        View v = LayoutInflater.from(chatActivity.this).inflate(R.layout.their_message_image, null);
        TextView sender_name_view = v.findViewById(R.id.sender_name_view);
        ImageView imageView = v.findViewById(R.id.receivedImageView);
        TextView message_time = v.findViewById(R.id.received_message_box_time);

        sender_name_view.setText(message.getSentByName());
        Picasso.get().load(message.getContent()).into(imageView);
        message_time.setText(getMomentAgo(message.getSentAt()));

        imageView.setId(id);

        chat_messages_view_panel.addView(v);
        scrollChatToBottom();

    }catch (Exception ignored)
    {

    }
}

private void addMyMessageImage(Message message, int id) {

    try {
        View v = LayoutInflater.from(chatActivity.this).inflate(R.layout.my_message_image, null);
        ImageView imageView = v.findViewById(R.id.sentImageView);
        TextView message_time = v.findViewById(R.id.sent_message_box_time);


        Picasso.get().load(message.getContent()).into(imageView);
        message_time.setText(getMomentAgo(message.getSentAt()));

        imageView.setId(id);

        chat_messages_view_panel.addView(v);
        scrollChatToBottom();

    }catch (Exception ignored)
    {

    }
}

private void addTheirMessage(Message message)
{
    try {
        View v = LayoutInflater.from(chatActivity.this).inflate(R.layout.their_message, null);
        TextView sender_name_view = v.findViewById(R.id.sender_name_view);
        TextView message_view = v.findViewById(R.id.sender_message_body);
        TextView message_time = v.findViewById(R.id.received_message_box_time);

        sender_name_view.setText(message.getSentByName());
        message_view.setText(message.getContent());
        message_time.setText(getMomentAgo(message.getSentAt()));

        chat_messages_view_panel.addView(v);
        scrollChatToBottom();

    }catch (Exception ignored)
    {

    }
}

private void addMyMessage(Message message)
{
    try {
        View v = LayoutInflater.from(chatActivity.this).inflate(R.layout.my_message, null);
        TextView message_view = v.findViewById(R.id.my_message_body);
        TextView message_time = v.findViewById(R.id.sent_message_box_time);
        message_view.setText(message.getContent());
        message_time.setText(getMomentAgo(message.getSentAt()));

        chat_messages_view_panel.addView(v);
        scrollChatToBottom();

    }catch (Exception ignored)
    {

    }
}

public void scrollChatToBottom() {
    chat_messages_scroll_view.post(new Runnable() {
        @Override
        public void run() {
            chat_messages_scroll_view.fullScroll(ScrollView.FOCUS_DOWN);
        }
    });
}

private void OpenGallery()
{
    Intent galleryIntent = new Intent();
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, GalleryPick);
}

@SuppressLint("SimpleDateFormat")
public String getMomentAgo(String date_time){
    try{
        SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy MM, dd HH:mm:ss:SSS a");
        SimpleDateFormat destFormat = new SimpleDateFormat("dd MMM, HH:mm a");
        Date convertedDate = sourceFormat.parse(date_time);
        if (convertedDate != null) {
            return destFormat.format(convertedDate);
        }
    }catch (Exception ignored){}
    return "";
}

public void imageClick(View view)
{
    Dialog builder = new Dialog(this);
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE);
    builder.getWindow().setBackgroundDrawable(
            new ColorDrawable(android.graphics.Color.TRANSPARENT));
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface) {
            //nothing;
        }
    });

    ImageView imageView = new ImageView(this);
    Picasso.get().load(imagesUrl.get(view.getId())).into(imageView);
    builder.addContentView(imageView, new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT));
    builder.show();
}

public void loadMessages(){
    FirebaseDatabase.getInstance().getReference().child("Messages").child(Prevelent.onlineUser.getEmail()).
            addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot)
                {
                    for(DataSnapshot item: snapshot.getChildren())
                    {
                        Message message = item.getValue(Message.class);
                        if(!message_ids.contains(message.getId()))
                        {
                            message_ids.add(message.getId());
                            addMessage(message);
                        }
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
}

You can follow this tutorial:

Send Device-to-Device Push Notifications Without Server-side Code

Update

You can Listen for a database specific child and show notification when there is a change happens (Simulating Server Push notification)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM