org.solovyev.android.messenger.messages.Messages.java Source code

Java tutorial

Introduction

Here is the source code for org.solovyev.android.messenger.messages.Messages.java

Source

/*
 * Copyright 2013 serso aka se.solovyev
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.solovyev.android.messenger.messages;

import android.text.Html;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.solovyev.android.messenger.accounts.Account;
import org.solovyev.android.messenger.chats.Chat;
import org.solovyev.android.messenger.core.R;
import org.solovyev.android.messenger.entities.Entity;
import org.solovyev.android.messenger.realms.Realm;
import org.solovyev.android.messenger.users.User;
import org.solovyev.android.messenger.users.Users;
import org.solovyev.common.text.Strings;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.TimeZone;

import static org.joda.time.DateTime.now;
import static org.joda.time.format.DateTimeFormat.shortDate;
import static org.joda.time.format.DateTimeFormat.shortTime;
import static org.solovyev.android.messenger.App.getApplication;
import static org.solovyev.android.messenger.accounts.AccountService.NO_ACCOUNT_ID;
import static org.solovyev.android.messenger.entities.Entities.generateEntity;
import static org.solovyev.android.messenger.entities.Entities.newEntityFromEntityId;
import static org.solovyev.android.messenger.messages.MessageState.*;

public final class Messages {

    private Messages() {
        throw new AssertionError();
    }

    @Nonnull
    public static CharSequence getMessageTime(@Nonnull Message message) {
        final DateTimeZone localTimeZone = DateTimeZone.forTimeZone(TimeZone.getDefault());

        final DateTime localSendDateTime = message.getLocalSendDateTime();
        final LocalDate localSendDate = message.getLocalSendDate();

        final LocalDate localToday = now(localTimeZone).toLocalDate();
        final LocalDate localYesterday = localToday.minusDays(1);

        if (localSendDate.toDateTimeAtStartOfDay().compareTo(localToday.toDateTimeAtStartOfDay()) == 0) {
            // today
            // print time
            return shortTime().print(localSendDateTime);
        } else if (localSendDate.toDateTimeAtStartOfDay().compareTo(localYesterday.toDateTimeAtStartOfDay()) == 0) {
            // yesterday
            return getApplication().getString(R.string.mpp_yesterday_at) + " "
                    + shortTime().print(localSendDateTime);
        } else {
            // the days before yesterday
            return shortDate().print(localSendDateTime) + " " + getApplication().getString(R.string.mpp_at_time)
                    + " " + shortTime().print(localSendDateTime);
        }
    }

    @Nonnull
    public static CharSequence getMessageTitle(@Nonnull Chat chat, @Nonnull Message message, @Nonnull User user) {
        final String authorPrefix = getMessageAuthorPrefix(chat, message, user);
        if (Strings.isEmpty(authorPrefix)) {
            return Html.fromHtml(message.getBody());
        } else {
            return authorPrefix + " " + Html.fromHtml(message.getBody());
        }
    }

    @Nonnull
    private static String getMessageAuthorPrefix(@Nonnull Chat chat, @Nonnull Message message, @Nonnull User user) {
        final Entity author = message.getAuthor();
        if (user.getEntity().equals(author)) {
            return "";
        } else {
            if (!chat.isPrivate()) {
                return " " + Users.getDisplayNameFor(author) + ":";
            } else {
                return "";
            }
        }
    }

    @Nonnull
    public static MutableMessage newEmptyMessage(@Nonnull String messageId) {
        return new MessageImpl(newEntityFromEntityId(messageId));
    }

    @Nonnull
    public static MutableMessage newIncomingMessage(@Nonnull Account account, @Nonnull Chat chat,
            @Nonnull String message, @Nullable String title, @Nonnull Entity author) {
        final MutableMessage result = newMessage(generateEntity(account));

        result.setChat(chat.getEntity());
        result.setAuthor(author);
        if (chat.isPrivate()) {
            result.setRecipient(account.getUser().getEntity());
        }
        result.setSendDate(now());
        result.setState(received);
        result.setRead(false);
        result.setBody(message);
        result.setTitle(title == null ? "" : title);

        return result;
    }

    @Nonnull
    public static MutableMessage newOutgoingMessage(@Nonnull Account account, @Nonnull Chat chat,
            @Nonnull String message, @Nullable String title) {
        final MutableMessage result = newMessage(generateEntity(account));

        result.setChat(chat.getEntity());
        result.setAuthor(account.getUser().getEntity());
        if (chat.isPrivate()) {
            result.setRecipient(chat.getSecondUser());
        }
        result.setSendDate(now());
        result.setState(sending);
        result.setRead(true);
        result.setBody(message);
        result.setTitle(title == null ? "" : title);

        return result;
    }

    @Nonnull
    public static MutableMessage newMessage(@Nonnull Entity entity) {
        return new MessageImpl(entity);
    }

    public static int compareSendDatesLatestFirst(@Nullable Message lm, @Nullable Message rm) {
        if (lm == null && rm == null) {
            return 0;
        } else if (lm == null) {
            return 1;
        } else if (rm == null) {
            return -1;
        } else {
            return -lm.getSendDate().compareTo(rm.getSendDate());
        }
    }

    public static int compareSendDatesLatestFirst(@Nullable DateTime lm, @Nullable DateTime rm) {
        if (lm == null && rm == null) {
            return 0;
        } else if (lm == null) {
            return 1;
        } else if (rm == null) {
            return -1;
        } else {
            return -lm.compareTo(rm);
        }
    }

    public static int compareSendDates(@Nullable Message lm, @Nullable Message rm) {
        if (lm == null && rm == null) {
            return 0;
        } else if (lm == null) {
            return 1;
        } else if (rm == null) {
            return -1;
        } else {
            return lm.getSendDate().compareTo(rm.getSendDate());
        }
    }

    @Nonnull
    public static MutableMessage copySentMessage(@Nonnull Message message, @Nonnull Account account,
            @Nonnull String accountMessageId) {
        final Realm realm = account.getRealm();
        final Entity messageId;
        if (accountMessageId.equals(NO_ACCOUNT_ID)) {
            // auto-generated id
            messageId = message.getEntity();
        } else {
            messageId = account.newMessageEntity(accountMessageId);
        }

        final MutableMessage result = newMessage(messageId);

        result.setChat(message.getChat());
        result.setAuthor(message.getAuthor());
        if (message.isPrivate()) {
            result.setRecipient(message.getRecipient());
        }
        result.setBody(message.getBody());
        result.setTitle(message.getTitle());
        result.setSendDate(message.getSendDate());
        if (realm.shouldWaitForDeliveryReport()) {
            result.setState(sending);
        } else {
            result.setState(sent);
        }
        result.setRead(true);
        result.getProperties().setPropertiesFrom(message.getProperties().getPropertiesCollection());

        if (!messageId.equals(message.getEntity())) {
            // id has changed => need to set original message id
            result.setOriginalId(message.getEntity().getEntityId());
        }

        return result;
    }
}