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;
 28
 29import tools.fastlane.screengrab.Screengrab;
 30import tools.fastlane.screengrab.cleanstatusbar.CleanStatusBar;
 31import tools.fastlane.screengrab.locale.LocaleTestRule;
 32
 33import eu.siacs.conversations.entities.Account;
 34import eu.siacs.conversations.entities.Contact;
 35import eu.siacs.conversations.entities.Conversation;
 36import eu.siacs.conversations.entities.Message;
 37import eu.siacs.conversations.entities.Presence;
 38import eu.siacs.conversations.entities.ServiceDiscoveryResult;
 39import eu.siacs.conversations.entities.TransferablePlaceholder;
 40import eu.siacs.conversations.persistance.FileBackend;
 41import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
 42import eu.siacs.conversations.services.XmppConnectionService;
 43import eu.siacs.conversations.test.R;
 44import eu.siacs.conversations.ui.ConversationsActivity;
 45import eu.siacs.conversations.xml.Element;
 46import eu.siacs.conversations.xmpp.Jid;
 47import eu.siacs.conversations.xmpp.pep.Avatar;
 48import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 49
 50@RunWith(AndroidJUnit4.class)
 51public class ScreenshotTest {
 52
 53	static String pkg = InstrumentationRegistry.getInstrumentation().getContext().getPackageName();
 54	static XmppConnectionService xmppConnectionService;
 55	static Account account;
 56
 57	@ClassRule
 58	public static final LocaleTestRule localeTestRule = new LocaleTestRule();
 59
 60	@ClassRule
 61	public static final ServiceTestRule xmppServiceRule = new ServiceTestRule();
 62
 63	@BeforeClass
 64	public static void setup() throws TimeoutException {
 65		CleanStatusBar.enableWithDefaults();
 66
 67		Intent intent = new Intent(ApplicationProvider.getApplicationContext(), XmppConnectionService.class);
 68		intent.setAction("ui");
 69		xmppConnectionService = ((XmppConnectionBinder) xmppServiceRule.bindService(intent)).getService();
 70		account = xmppConnectionService.findAccountByJid(Jid.of("carrot@chaosah.hereva"));
 71		if (account == null) {
 72			account = new Account(
 73				Jid.of("carrot@chaosah.hereva"),
 74				"orangeandfurry"
 75			);
 76			xmppConnectionService.createAccount(account);
 77		}
 78
 79		Uri avatarUri = Uri.parse("android.resource://" + pkg + "/" + String.valueOf(R.drawable.carrot));
 80		final Avatar avatar = xmppConnectionService.getFileBackend().getPepAvatar(avatarUri, 192, Bitmap.CompressFormat.WEBP);
 81		xmppConnectionService.getFileBackend().save(avatar);
 82		account.setAvatar(avatar.getFilename());
 83
 84		Contact cheogram = account.getRoster().getContact(Jid.of("cheogram.com"));
 85		cheogram.setOption(Contact.Options.IN_ROSTER);
 86		Presence cheogramPresence = Presence.parse(null, null, "");
 87		IqPacket discoPacket = new IqPacket(IqPacket.TYPE.RESULT);
 88		Element query = discoPacket.addChild("query", "http://jabber.org/protocol/disco#info");
 89		Element identity = query.addChild("identity");
 90		identity.setAttribute("category", "gateway");
 91		identity.setAttribute("type", "pstn");
 92		cheogramPresence.setServiceDiscoveryResult(new ServiceDiscoveryResult(discoPacket));
 93		cheogram.updatePresence("gw", cheogramPresence);
 94	}
 95
 96	@AfterClass
 97	public static void teardown() {
 98		CleanStatusBar.disable();
 99	}
100
101	@Rule
102	public ActivityScenarioRule<ConversationsActivity> activityRule = new ActivityScenarioRule<>(ConversationsActivity.class);
103
104	@Test
105	public void testTakeScreenshot() throws FileBackend.FileCopyException, InterruptedException {
106		Conversation conversation = xmppConnectionService.findOrCreateConversation(account, Jid.of("+15550737737@cheogram.com"), false, false);
107		conversation.getContact().setOption(Contact.Options.IN_ROSTER);
108		conversation.getContact().setSystemName("Pepper");
109		conversation.getContact().setPhotoUri("android.resource://" + pkg + "/" + String.valueOf(R.drawable.pepper));
110
111		Message voicemail = new Message(conversation, "", 0, Message.STATUS_RECEIVED);
112		voicemail.setOob("https://example.com/thing.mp3");
113		voicemail.setFileParams(new Message.FileParams("https://example.com/thing.mp3|5000|0|0|10000"));
114		voicemail.setType(Message.TYPE_FILE);
115		voicemail.setSubject("Voicemail Recording");
116
117		Message transcript = new Message(conversation, "Where are you?", 0, Message.STATUS_RECEIVED);
118		transcript.setSubject("Voicemail Transcription");
119
120		Message picture = new Message(conversation, "", 0, Message.STATUS_SEND_RECEIVED);
121		picture.setOob("https://example.com/thing.webp");
122		picture.setType(Message.TYPE_FILE);
123		xmppConnectionService.getFileBackend().copyFileToPrivateStorage(
124			picture,
125			Uri.parse("android.resource://" + pkg + "/" + String.valueOf(R.drawable.komona)),
126			"image/webp"
127		);
128		xmppConnectionService.getFileBackend().updateFileParams(picture);
129
130		conversation.addAll(0, Arrays.asList(
131			voicemail,
132			transcript,
133			new Message(conversation, "Meow", 0, Message.STATUS_SEND_RECEIVED),
134			picture,
135			new Message(conversation, "👍", 0, Message.STATUS_RECEIVED)
136		));
137
138		ActivityScenario scenario = activityRule.getScenario();
139		scenario.onActivity((Activity activity) -> {
140			((ConversationsActivity) activity).switchToConversation(conversation);
141		});
142		InstrumentationRegistry.getInstrumentation().waitForIdleSync();
143		Thread.sleep(100); // ImageView not paited yet after waitForIdleSync
144		Screengrab.screenshot("conversation");
145	}
146}