История чата - изображение загружается перед текстом - android - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение чата, и теперь я нахожусь в части истории (я использую эту библиотеку - https://github.com/stfalcon-studio/ChatKit) Я получаю данные с сервера, затем я проверяю, отображается ли текст, я их отображаю, иначе, если это изображение, тогда я запрашиваю с модификацией для получения массива байтов изображения (изображение, полученное с сервера, находится в текстовом формате, поэтому мне нужен дополнительный вызов для получения изображения imageBytes и показать его с Glide.) Моя проблема в этом примере в моем чате есть TEXT1, TEXT2, IMAGE1, IMAGE2, TEXT3, IMAGE3, TEXT4. История загружается так: IMAGE1, IMAGE2, IMAGE3, TEXT1, TEXT2, TEXT3, TEXT4.

Вот мой код.

public class ChatSample extends BaseFragment {

private View mainView;
private ApiClient apiClient;
private MessageList messageList;
private MessagesListAdapter<Message> messagesAdapter;
private String myUserName;
private String sender;
private Message message;
private MessagesHistory[] messagesHistory;

private static final String BUNDLE_USER_NAME = "personUserNameBundle";
private final String senderId = "0";
private static final String TAG = "4564323";
private final int CHAT_IMAGE_TYPE = 5;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mainView = inflater.inflate(R.layout.chat_fragment, container, false);
    apiClient = ApiClient.getInstance();

    //Setting my userName and other users userName
    Bundle bundle = getArguments();
    sender = bundle.getString(BUNDLE_USER_NAME);
    myUserName = SharedPreferencesManager.getInstance().getUserData().getUserName();


    //A function for image loading
    ImageLoader imageLoader = new ImageLoader() {
        @Override
        public void loadImage(ImageView imageView, String s, byte[] imageBytes) {
            Log.d(TAG, "Glide");
            if (imageBytes != null) {
                Glide.with(getActivity()).load(imageBytes).into(imageView);
            }
        }
    };

    messageList = (MessageList) mainView.findViewById(R.id.chatKitList);
    messagesAdapter = new MessagesListAdapter<>(senderId, imageLoader);
    messageList.setAdapter(messagesAdapter);


    //Getting date for requesting history
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd", Locale.US);

    Calendar mCurrentDate = Calendar.getInstance();
    int year = mCurrentDate.get(Calendar.YEAR);
    int month = mCurrentDate.get(Calendar.MONTH);
    int day = mCurrentDate.get(Calendar.DAY_OF_MONTH) + 1;
    mCurrentDate.set(year, month, day);

    Calendar earlierDate = Calendar.getInstance();
    int earlierYear = earlierDate.get(Calendar.YEAR);
    int earlierMonth = earlierDate.get(Calendar.MONTH);
    int earlierDay = earlierDate.get(Calendar.DAY_OF_MONTH) - 7;
    earlierDate.set(earlierYear, earlierMonth, earlierDay);

    String currentTextDate = dateFormat.format(mCurrentDate.getTime());
    String earlierTextDate = dateFormat.format(earlierDate.getTime());

    //requesting history
    getMessages(earlierTextDate, currentTextDate);

    return mainView;
}


//History request
public void getMessages(final String from, final String to) {
    Call<MessagesHistory[]> getMessageHistory = apiClient.getMessageHistory(from, to);
    getMessageHistory.enqueue(new Callback<MessagesHistory[]>() {
        @Override
        public void onResponse(Call<MessagesHistory[]> call, Response<MessagesHistory[]> response) {
            if (response.isSuccessful()) {

                messagesHistory = response.body();

                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
                dateFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

                //Getting all information about history
                for (int i = 0; i < messagesHistory.length; i++) {
                    String messageSender = messagesHistory[i].getSender();
                    String messageReceiver = messagesHistory[i].getReceiver();
                    final String messages = messagesHistory[i].getText();
                    String date = messagesHistory[i].getSendtime();

                    Date convertDate = new Date();
                    try {
                        convertDate = dateFormat.parse(date);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    convertDate.getTime();

                    //If I'm sending message
                    if (messageSender.equals(myUserName) && messageReceiver.equals(sender)) {

                        //If that is an image message
                        if(messages.startsWith("gago+")) {
                            getImagesHistory(convertDate, messages, "0");
                        } else {

                            //If that is a text message
                            getMessagesHistory(convertDate, messages, "0", null);
                        }
                    }

                    //If other user sends me a message
                    if (messageReceiver.equals(myUserName) && messageSender.equals(sender)) {

                        //If that is an image message
                        if(messages.startsWith("gago+")) {
                            getImagesHistory(convertDate, messages, "1");
                        } else {

                            //If that is a text message
                            getMessagesHistory(convertDate, messages, "1", null);
                        }
                    }
                }
            } else {
                Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<MessagesHistory[]> call, Throwable t) {
            Toast.makeText(context, "An error occurred", Toast.LENGTH_SHORT).show();
        }
    });
}

//Request an image when I already have the image name
public void getImagesHistory(final Date convertDate, final String messages, final String id) {
    String cutMessage = messages.substring(5, messages.length());
    Call<ResponseBody> getChatImageCall = apiClient.getImages(cutMessage, CHAT_IMAGE_TYPE);
    getChatImageCall.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, final Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                try {
                    getMessagesHistory(convertDate, messages, id, response.body().bytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getActivity(), "An error occurred", Toast.LENGTH_SHORT).show();
        }
    });
}

//Display the message we got
public void getMessagesHistory(final Date startDate, final String historyMessages, final String id, byte[] imgBytes) {
    ArrayList<Message> messages = new ArrayList<>();

    //I'm getting my images with an array of byte
    //So if the image bytes are not null
    if(imgBytes != null) {
        message = MessagesFixtures.getImageBytesMessage(imgBytes, id);
    } else {
        //This is a text
        message = MessagesFixtures.getTextMessage(historyMessages, id);
    }
    message.setCreatedAt(startDate);
    messages.add(message);
    messagesAdapter.addToEnd(messages, false);

}
}

В моем коде messagesAdapter.addToEnd(messages, false); выводит массив сообщений и наборов в recyclerView. В моем случае recyclerView это MessageList, а адаптер MessagesListAdapter. Поэтому я думаю, что мне нужно вытащить функцию messagesAdapter.addToEnd(messages, false); из getMessagesHistory и добавить в другое место. Но я не могу этого сделать, потому что getMessagesHistory имеет некоторые параметры в конструкторе, а последний аргумент byte[] imgBytes в некоторых случаях равен нулю. Когда я получаю текстовое сообщение с сервера, я устанавливаю его в ноль, иначе я устанавливаю свои байты массива. Поэтому, пожалуйста, помогите, как я могу сделать эту часть?

...