ChatFragmet

 avatar
hacker98
plain_text
6 months ago
11 kB
3
Indexable
main
package com.example.chatappdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.chatappdemo.DAO.ConversationDAO;
import com.example.chatappdemo.DAO.MessDAO;
import com.example.chatappdemo.model.Conversation;
import com.example.chatappdemo.model.Mess;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class ChatFragment extends Fragment {
    private static final String TAG = "SocketServerClient";
    private LinearLayout messageContainer;
    private EditText inputMess;
    private Button sendButton;
    private TextView textViewIP;
    private FloatingActionButton fab;
    private BroadcastReceiver newMessageReceiver;
    private String yourIP,MyIP;
    private Conversation conversation;
    private ConversationDAO conversationDAO;
    private MessDAO messDAO;
    private int Conver_id;
    private javaExternal func= new javaExternal();
    IntentFilter filter;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_chat, container, false);
        messageContainer = view.findViewById(R.id.messageContainer);
        inputMess = view.findViewById(R.id.inputMess);
        sendButton = view.findViewById(R.id.sendButton);
        textViewIP = view.findViewById(R.id.textViewIP);
        fab = view.findViewById(R.id.fab);
//        ScrollView scrollView=view.findViewById(R.id.scrollView);
        Bundle bundle = getArguments();

        if(bundle!=null) {
            yourIP = bundle.getString("conversation_IP");
            MyIP= bundle.getString("MyIP");
        }
        textViewIP.setText(yourIP);
        conversationDAO = new ConversationDAO(requireContext());
        messDAO = new MessDAO(requireContext());
        conversation =conversationDAO.getConversationByIPReceive(yourIP);
        Conver_id=conversation.getConver_id();
        List<Mess> MessList = messDAO.getMessagesByConversationId(Conver_id);
        Log.i("Socket","cuoc hoi thoai giua "+ MyIP +" va "+ yourIP);
        Log.i("Socket","khoa ma hoa 128: "+ conversation.getKeyEncrypt128() + "khoa ma hoa 256 la:"+conversation.getKeyEncrypt256()+ "dang su dng thuat toan ma hoa: "+ conversation.getAlgorithm());
//        lich su tro chuyen
        if(MessList!=null){
            for (Mess mess : MessList){
                String algorithm = mess.getAlgorithm();
                String messOut="giai ma loi";
                if(algorithm.equals("AES128")){
                    messOut=func.decryptAES128(mess.getMess_text(),conversation.getKeyEncrypt128());
                }else if(algorithm.equals("AES256")){
                    messOut=func.decryptAES256(mess.getMess_text(),conversation.getKeyEncrypt256());
                }else if(algorithm.equals("SNOWV")){
                    messOut = func.decryptSNOWV(mess.getMess_text(),conversation.getKeyEncrypt256());
                }
                if(mess.getSender_ip().equals(MyIP)){
                    String finalMessOut = messOut;
                    getActivity().runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           addMessageToUI(finalMessOut,true);
                       }
                   });
                }else{
                    String finalMessOut1 = messOut;
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            addMessageToUI(finalMessOut1,false);
                        }
                    });
                }
            }
        }


        newMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String ClientIP = intent.getStringExtra("ClientIP");
                String message = intent.getStringExtra("message");
                addMessageToUI(message, false);
            }
        };
        filter = new IntentFilter("com.example.chatappdemo.NEW_MESSAGE");
        requireActivity().registerReceiver(newMessageReceiver, filter);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu(view);
            }
        });
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String message = inputMess.getText().toString();
                if (!message.isEmpty()) {
                    try {
//                        ma hoa tin nhan
                        String cipher="ma hoa loi";
                        String algorithm = conversation.getAlgorithm();
                        if(algorithm.equals("AES128")){
                            cipher= func.encryptAES128(message,conversation.getKeyEncrypt128());
                        }else if(algorithm.equals("AES256")){
                            cipher = func.encryptAES256(message,conversation.getKeyEncrypt256());
                        }else if(algorithm.equals("SNOWV")){
                            cipher = func.encryptSNOWV(message,conversation.getKeyEncrypt256());
                        }
//                        tao json gui tin nhan
                        JSONObject messageJson = new JSONObject();
                        JSONObject messageContentJson = new JSONObject();
                        messageJson.put("type", "MESSAGE");
                        messageContentJson.put("mess_text", cipher);
                        messageContentJson.put("algorithm",algorithm);
                        messageJson.put("content", messageContentJson);

                        ChatClient chatClient = new ChatClient(yourIP, 1234, messageJson.toString());
                        chatClient.start();
                        addMessageToUI(message, true);
                        Mess MessSave = new Mess(conversation.getConver_id(),MyIP,cipher,getCurrentTime(),algorithm);
                        conversation.setLast_mess(message);
                        conversation.setLast_mess_time(getCurrentTime());
                        conversationDAO.updateConversation(conversation);
                        messDAO.insertMess(MessSave);
                        inputMess.setText("");
                    } catch (Exception e) {
                        e.printStackTrace();
                        Log.i(TAG, "Lỗi khi chuyển đổi JSON: " + e.getMessage());
                    }
                }
            }
        });

        return view;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        // Hủy đăng ký BroadcastReceiver khi Fragment bị hủy
        Log.i("Socket","fragment bi huy");
        if (newMessageReceiver != null) {
            requireActivity().unregisterReceiver(newMessageReceiver);
        }
    }
    public String getCurrentTime(){
        SimpleDateFormat sdf= new SimpleDateFormat("hh:mm a", Locale.getDefault());
        return sdf.format(new Date());
    }
    public void showPopupMenu(View view){
        PopupMenu popupMenu = new PopupMenu(getContext(),view);
        popupMenu.getMenu().add("AES 128");
        popupMenu.getMenu().add("AES 256");
        popupMenu.getMenu().add("SNOWV");
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                String title= menuItem.getTitle().toString();
                switch (title){
                    case "AES 128":
                        conversation.setKeyEncrypt128("AES128");
                        conversationDAO.updateConversation(conversation);
                        Toast.makeText(getContext(),"Da chuyen sang che do ma hoa AES 128",Toast.LENGTH_SHORT).show();
                        return true;
                    case "AES 256":
                        conversation.setAlgorithm("AES256");
                        conversationDAO.updateConversation(conversation);
                        Toast.makeText(getContext(),"Da chuyen sang che do ma hoa AES 256",Toast.LENGTH_SHORT).show();
                        return true;
                    case "SNOWV":
                        conversation.setAlgorithm("SNOWV");
                        conversationDAO.updateConversation(conversation);
                        Toast.makeText(getContext(),"Da chuyen sang che do ma hoa SNOWV",Toast.LENGTH_SHORT).show();
                        return true;
                    default:
                        return false;
                }
            }
        });
        popupMenu.show();
    }
    public void addMessageToUI(String message, boolean isSent) {
        TextView textView = new TextView(getContext());
        textView.setText(message);
        textView.setTextSize(16);
        textView.setPadding(10, 10, 10, 10);
        textView.setTextColor(getResources().getColor(android.R.color.white));

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                (int) (getResources().getDisplayMetrics().widthPixels * 0.6),
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(10, 10, 10, 10);

        if (isSent) {
            textView.setBackgroundResource(R.color.purple_200); // Blue for sent messages
            params.gravity = Gravity.END;
        } else {
            textView.setBackgroundResource(R.color.teal_700); // Color for received messages
            params.gravity = Gravity.START;
        }

        textView.setLayoutParams(params);
        messageContainer.addView(textView);

        // Scroll to the bottom of the scroll view
        final ScrollView scrollView = getActivity().findViewById(R.id.scrollView);
        if(scrollView != null){
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }else {
            Log.d("Socket","Scroll View is null");
        }
    }
}
Editor is loading...
Leave a Comment