ScreenshotTest.java

  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.setOob("https://example.com/thing.mp3");
115		voicemail.setFileParams(new Message.FileParams("https://example.com/thing.mp3|5000|0|0|10000"));
116		voicemail.setType(Message.TYPE_FILE);
117		voicemail.setSubject("Voicemail Recording");
118
119		Message transcript = new Message(conversation, "Where are you?", 0, Message.STATUS_RECEIVED);
120		transcript.setSubject("Voicemail Transcription");
121
122		Message picture = new Message(conversation, "", 0, Message.STATUS_SEND_RECEIVED);
123		picture.setOob("https://example.com/thing.webp");
124		picture.setType(Message.TYPE_FILE);
125		xmppConnectionService.getFileBackend().copyFileToPrivateStorage(
126			picture,
127			Uri.parse("android.resource://" + pkg + "/" + String.valueOf(R.drawable.komona)),
128			"image/webp"
129		);
130		xmppConnectionService.getFileBackend().updateFileParams(picture);
131
132		conversation.addAll(0, Arrays.asList(
133			voicemail,
134			transcript,
135			new Message(conversation, "Meow", 0, Message.STATUS_SEND_RECEIVED),
136			picture,
137			new Message(conversation, "👍", 0, Message.STATUS_RECEIVED)
138		));
139
140		ActivityScenario scenario = ActivityScenario.launch(ConversationsActivity.class);
141		scenario.onActivity((Activity activity) -> {
142			((ConversationsActivity) activity).switchToConversation(conversation);
143		});
144		InstrumentationRegistry.getInstrumentation().waitForIdleSync();
145		Thread.sleep(100); // ImageView not paited yet after waitForIdleSync
146		Screengrab.screenshot("conversation");
147	}
148
149	@Test
150	public void testStartConversation() throws InterruptedException {
151		ActivityScenario scenario = ActivityScenario.launch(StartConversationActivity.class);
152		InstrumentationRegistry.getInstrumentation().waitForIdleSync();
153		Thread.sleep(100); // ImageView not paited yet after waitForIdleSync
154		Screengrab.screenshot("startConversation");
155	}
156
157	@Test
158	public void testAddContact() throws InterruptedException {
159		ActivityScenario scenario = ActivityScenario.launch(StartConversationActivity.class);
160		onView(withId(eu.siacs.conversations.R.id.speed_dial)).perform(click());
161		Screengrab.screenshot("startConversationOptions");
162
163		// Not actually online, so can't screenshot the gateway selector yet
164		/*onView(withId(eu.siacs.conversations.R.id.create_contact)).perform(click());
165		InstrumentationRegistry.getInstrumentation().waitForIdleSync();
166		Thread.sleep(10000); // ImageView not paited yet after waitForIdleSync
167		Screengrab.screenshot("addContact");*/
168	}
169}