1package com.cheogram.android.test;
2
3import java.util.concurrent.TimeoutException;
4import java.lang.Thread;
5import java.util.Arrays;
6
7import org.junit.AfterClass;
8import org.junit.BeforeClass;
9import org.junit.ClassRule;
10import org.junit.Rule;
11import org.junit.Test;
12import org.junit.runner.RunWith;
13import org.junit.runners.JUnit4;
14
15import android.app.Activity;
16import android.content.Intent;
17import android.graphics.Bitmap;
18import android.net.Uri;
19import android.os.Bundle;
20import android.util.Log;
21
22import androidx.test.InstrumentationRegistry;
23import androidx.test.core.app.ActivityScenario;
24import androidx.test.core.app.ApplicationProvider;
25import androidx.test.ext.junit.rules.ActivityScenarioRule;
26import androidx.test.ext.junit.runners.AndroidJUnit4;
27import androidx.test.rule.ServiceTestRule;
28import static androidx.test.espresso.Espresso.onView;
29import static androidx.test.espresso.action.ViewActions.click;
30import static androidx.test.espresso.matcher.ViewMatchers.withId;
31
32import tools.fastlane.screengrab.Screengrab;
33import tools.fastlane.screengrab.cleanstatusbar.CleanStatusBar;
34import tools.fastlane.screengrab.locale.LocaleTestRule;
35
36import eu.siacs.conversations.entities.Account;
37import eu.siacs.conversations.entities.Contact;
38import eu.siacs.conversations.entities.Conversation;
39import eu.siacs.conversations.entities.Message;
40import eu.siacs.conversations.entities.Presence;
41import eu.siacs.conversations.entities.ServiceDiscoveryResult;
42import eu.siacs.conversations.entities.TransferablePlaceholder;
43import eu.siacs.conversations.persistance.FileBackend;
44import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
45import eu.siacs.conversations.services.XmppConnectionService;
46import eu.siacs.conversations.test.R;
47import eu.siacs.conversations.ui.ConversationsActivity;
48import eu.siacs.conversations.ui.StartConversationActivity;
49import eu.siacs.conversations.xml.Element;
50import eu.siacs.conversations.xmpp.Jid;
51import eu.siacs.conversations.xmpp.pep.Avatar;
52import eu.siacs.conversations.xmpp.stanzas.IqPacket;
53
54@RunWith(AndroidJUnit4.class)
55public class ScreenshotTest {
56
57 static String pkg = InstrumentationRegistry.getInstrumentation().getContext().getPackageName();
58 static XmppConnectionService xmppConnectionService;
59 static Account account;
60
61 @ClassRule
62 public static final LocaleTestRule localeTestRule = new LocaleTestRule();
63
64 @ClassRule
65 public static final ServiceTestRule xmppServiceRule = new ServiceTestRule();
66
67 @BeforeClass
68 public static void setup() throws TimeoutException {
69 CleanStatusBar.enableWithDefaults();
70
71 Intent intent = new Intent(ApplicationProvider.getApplicationContext(), XmppConnectionService.class);
72 intent.setAction("ui");
73 xmppConnectionService = ((XmppConnectionBinder) xmppServiceRule.bindService(intent)).getService();
74 account = xmppConnectionService.findAccountByJid(Jid.of("carrot@chaosah.hereva"));
75 if (account == null) {
76 account = new Account(
77 Jid.of("carrot@chaosah.hereva"),
78 "orangeandfurry"
79 );
80 xmppConnectionService.createAccount(account);
81 }
82
83 Uri avatarUri = Uri.parse("android.resource://" + pkg + "/" + String.valueOf(R.drawable.carrot));
84 final Avatar avatar = xmppConnectionService.getFileBackend().getPepAvatar(avatarUri, 192, Bitmap.CompressFormat.WEBP);
85 xmppConnectionService.getFileBackend().save(avatar);
86 account.setAvatar(avatar.getFilename());
87
88 Contact cheogram = account.getRoster().getContact(Jid.of("cheogram.com"));
89 cheogram.setOption(Contact.Options.IN_ROSTER);
90 cheogram.setPhotoUri("android.resource://" + pkg + "/" + String.valueOf(R.drawable.cheogram));
91 Presence cheogramPresence = Presence.parse(null, null, "");
92 IqPacket discoPacket = new IqPacket(IqPacket.TYPE.RESULT);
93 Element query = discoPacket.addChild("query", "http://jabber.org/protocol/disco#info");
94 Element identity = query.addChild("identity");
95 identity.setAttribute("category", "gateway");
96 identity.setAttribute("type", "pstn");
97 cheogramPresence.setServiceDiscoveryResult(new ServiceDiscoveryResult(discoPacket));
98 cheogram.updatePresence("gw", cheogramPresence);
99 }
100
101 @AfterClass
102 public static void teardown() {
103 CleanStatusBar.disable();
104 }
105
106 @Test
107 public void testConversation() throws FileBackend.FileCopyException, InterruptedException {
108 Conversation conversation = xmppConnectionService.findOrCreateConversation(account, Jid.of("+15550737737@cheogram.com"), false, false);
109 conversation.getContact().setOption(Contact.Options.IN_ROSTER);
110 conversation.getContact().setSystemName("Pepper");
111 conversation.getContact().setPhotoUri("android.resource://" + pkg + "/" + String.valueOf(R.drawable.pepper));
112
113 Message voicemail = new Message(conversation, "", 0, Message.STATUS_RECEIVED);
114 voicemail.setFileParams(new Message.FileParams("https://example.com/thing.mp3|5000|0|0|10000"));
115 voicemail.setType(Message.TYPE_FILE);
116 voicemail.setSubject("Voicemail Recording");
117
118 Message transcript = new Message(conversation, "Where are you?", 0, Message.STATUS_RECEIVED);
119 transcript.setSubject("Voicemail Transcription");
120
121 Message picture = new Message(conversation, "", 0, Message.STATUS_SEND_RECEIVED);
122 picture.setFileParams(new Message.FileParams("https://example.com/thing.webp"));
123 picture.setType(Message.TYPE_FILE);
124 xmppConnectionService.getFileBackend().copyFileToPrivateStorage(
125 picture,
126 Uri.parse("android.resource://" + pkg + "/" + String.valueOf(R.drawable.komona)),
127 "image/webp"
128 );
129 xmppConnectionService.getFileBackend().updateFileParams(picture);
130
131 conversation.addAll(0, Arrays.asList(
132 voicemail,
133 transcript,
134 new Message(conversation, "Meow", 0, Message.STATUS_SEND_RECEIVED),
135 picture,
136 new Message(conversation, "👍", 0, Message.STATUS_RECEIVED)
137 ));
138
139 ActivityScenario scenario = ActivityScenario.launch(ConversationsActivity.class);
140 scenario.onActivity((Activity activity) -> {
141 ((ConversationsActivity) activity).switchToConversation(conversation);
142 });
143 InstrumentationRegistry.getInstrumentation().waitForIdleSync();
144 Thread.sleep(100); // ImageView not paited yet after waitForIdleSync
145 Screengrab.screenshot("conversation");
146 }
147
148 @Test
149 public void testStartConversation() throws InterruptedException {
150 ActivityScenario scenario = ActivityScenario.launch(StartConversationActivity.class);
151 InstrumentationRegistry.getInstrumentation().waitForIdleSync();
152 Thread.sleep(100); // ImageView not paited yet after waitForIdleSync
153 Screengrab.screenshot("startConversation");
154 }
155
156 @Test
157 public void testAddContact() throws InterruptedException {
158 ActivityScenario scenario = ActivityScenario.launch(StartConversationActivity.class);
159 onView(withId(eu.siacs.conversations.R.id.speed_dial)).perform(click());
160 Screengrab.screenshot("startConversationOptions");
161
162 // Not actually online, so can't screenshot the gateway selector yet
163 /*onView(withId(eu.siacs.conversations.R.id.create_contact)).perform(click());
164 InstrumentationRegistry.getInstrumentation().waitForIdleSync();
165 Thread.sleep(10000); // ImageView not paited yet after waitForIdleSync
166 Screengrab.screenshot("addContact");*/
167 }
168}