Автоматизация приложения чата - PullRequest
0 голосов
/ 07 июня 2018

Я хотел автоматизировать одно из наших официальных приложений, которое работает как WhatsApp.Чтобы проверить это, необходимо открыть два устройства одновременно, а затем использовать одно устройство для отправки сообщений / изображений или создания группы.И затем, в то же время, проверьте его на другом устройстве, если все операции выполнены успешно (сообщения получены, добавлены в качестве члена группы).Приложение основано на XMPP.

Может кто-нибудь подсказать, пожалуйста, как действовать и какой инструмент мы можем использовать для автоматизации функций?

1 Ответ

0 голосов
/ 08 июня 2018

Ну, вы можете реализовать свой собственный Stanza как Extension так же, как я это сделал для состояния сообщений Seen.

Сначала вы создаете свой класс как Seen, который реализует PacketExtension как Seen.

public class Seen implements PacketExtension, Parcelable {
    public static final String NAMESPACE = "jabber:client";
    public static final String ELEMENT_NAME = "seen";
    public static final String TAG_NAME_NAME = "from";

    private String from;

    public Seen() {}

    public Seen(Parcel parcel) {
        from = parcel.readString();
    }

    public String getName() {
        return name;
    }

    @Override
    public String getElementName() {
        return ELEMENT_NAME;
    }

    @Override
    public String getNamespace() {
        return NAMESPACE;
    }

    @Override
    public CharSequence toXML() {
        return String.format("<seen xmlns='jabber:client'><from>%s</from></seen>", from);
    }

    public String getSeen() {
        return seen;
    }


    public void setSeen(String seen) {
        this.seen = seen;
    }    

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(address);
        dest.writeDouble(latitude);
        dest.writeDouble(longitude);
    }

    public static final Parcelable.Creator<Seen> CREATOR = new Creator<Seen>() {

        @Override
        public Seen createFromParcel(Parcel source) {
            return new Seen(source);
        }

        @Override
        public Seen[] newArray(int size) {
            return new Seen[size];
        }
    };
}

Второй в ProviderManager вы добавляете свое расширение как:

ProviderManager.addExtensionProvider(Seen.ELEMENT_NAME, Seen.NAMESPACE, new SeenMessageProvider());

В-третьих, у вас должен быть MessagePacketListener, который реализует PacketListener, и когда вы получаете строфу вашего сообщения, вы проверяете, является ли это instance of Seen классом в переопределенном методе processPacket, например:

@Override
    public void processPacket(Packet packet) {
        Message msg = (Message)packet;      

        Collection<PacketExtension> extensions = msg.getExtensions();
        if (extensions != null) {
            Iterator<PacketExtension> iterator = extensions.iterator();
            if (iterator.hasNext()) {
                PacketExtension extension = iterator.next();
                if (extension instanceof Seen) {
                    //Do sth
                }
            }
        }
    }

И последний при отправкеваше сообщение в вашем методе вы отправляете расширение как:

Seen seen = new Seen();
seen.setFrom("FromUser");
PacketExtension packetExtension = seen;
sendChatMessage(to, body, packetExtension);

public void sendChatMessage(String to, String body, PacketExtension packetExtension) throws SmackInvocationException {
            Message message = new Message(to, Message.Type.chat);
            message.setBody(body);
            if (packetExtension != null) {
                message.addExtension(packetExtension);
            }
            try {
                con.sendPacket(message);
            } catch (NotConnectedException e) {
                throw new SmackInvocationException(e);
            }
        }
...