From ac1bfcae60e32eee569ddedb7b77f312cbbf9f67 Mon Sep 17 00:00:00 2001
From: goapunk <goapunk@riseup.net>
Date: Tue, 24 Apr 2018 11:54:20 +0200
Subject: [PATCH] Make test data creation configurable.

---
 briar-android/src/main/AndroidManifest.xml    |  10 ++
 .../android/activity/ActivityComponent.java   |   3 +
 .../android/settings/SettingsFragment.java    |  12 +-
 .../briar/android/test/TestDataActivity.java  | 100 +++++++++++
 .../main/res/layout/activity_test_data.xml    | 170 ++++++++++++++++++
 briar-android/src/main/res/xml/settings.xml   |   9 +-
 .../briar/api/test/TestDataCreator.java       |  13 ++
 .../briar/test/TestDataCreatorImpl.java       |  46 +++--
 8 files changed, 332 insertions(+), 31 deletions(-)
 create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java
 create mode 100644 briar-android/src/main/res/layout/activity_test_data.xml

diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index cc195722b5..19b55dca6c 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -352,6 +352,16 @@
 				/>
 		</activity>
 
+		<activity
+			android:name="org.briarproject.briar.android.test.TestDataActivity"
+			android:label="Create test data"
+			android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
+			<meta-data
+				android:name="android.support.PARENT_ACTIVITY"
+				android:value="org.briarproject.briar.android.settings.SettingsActivity"
+				/>
+		</activity>
+
 		<activity
 			android:name="org.briarproject.briar.android.panic.PanicPreferencesActivity"
 			android:label="@string/panic_setting"
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
index 2f8ca83faa..68564c4e49 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java
@@ -70,6 +70,7 @@ import org.briarproject.briar.android.sharing.ShareForumFragment;
 import org.briarproject.briar.android.sharing.ShareForumMessageFragment;
 import org.briarproject.briar.android.sharing.SharingModule;
 import org.briarproject.briar.android.splash.SplashScreenActivity;
+import org.briarproject.briar.android.test.TestDataActivity;
 
 import dagger.Component;
 
@@ -147,6 +148,8 @@ public interface ActivityComponent {
 
 	void inject(SettingsActivity activity);
 
+	void inject(TestDataActivity activity);
+
 	void inject(ChangePasswordActivity activity);
 
 	void inject(IntroductionActivity activity);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
index 1efca23465..8f8c444040 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
@@ -30,7 +30,6 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
 import org.briarproject.bramble.util.StringUtils;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.util.UserFeedback;
-import org.briarproject.briar.api.test.TestDataCreator;
 
 import java.util.logging.Logger;
 
@@ -105,8 +104,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
 
 	@Inject
 	AndroidExecutor androidExecutor;
-	@Inject
-	TestDataCreator testDataCreator;
 
 	@Override
 	public void onAttach(Context context) {
@@ -153,14 +150,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
 				});
 
 		Preference testData = findPreference("pref_key_test_data");
-		if (IS_DEBUG_BUILD) {
-			testData.setOnPreferenceClickListener(preference -> {
-				LOG.info("Creating test data");
-				testDataCreator.createTestData();
-				getActivity().finish();
-				return true;
-			});
-		} else {
+		if (!IS_DEBUG_BUILD) {
 			testData.setVisible(false);
 		}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java
new file mode 100644
index 0000000000..632d82ea4b
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/test/TestDataActivity.java
@@ -0,0 +1,100 @@
+package org.briarproject.briar.android.test;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+
+import org.briarproject.briar.R;
+import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.activity.BriarActivity;
+import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
+import org.briarproject.briar.api.test.TestDataCreator;
+
+import javax.inject.Inject;
+
+public class TestDataActivity extends BriarActivity {
+
+	@Inject
+	TestDataCreator testDataCreator;
+
+	private TextView[] textviews = new TextView[5];
+	private SeekBar[] seekbars = new SeekBar[5];
+
+	@Override
+	public void onCreate(Bundle bundle) {
+		super.onCreate(bundle);
+
+		ActionBar actionBar = getSupportActionBar();
+		if (actionBar != null) {
+			actionBar.setHomeButtonEnabled(true);
+			actionBar.setDisplayHomeAsUpEnabled(true);
+		}
+
+		setContentView(R.layout.activity_test_data);
+		textviews[0] = findViewById(R.id.textViewContactsSb);
+		textviews[1] = findViewById(R.id.textViewMessagesSb);
+		textviews[2] = findViewById(R.id.TextViewBlogPostsSb);
+		textviews[3] = findViewById(R.id.TextViewForumsSb);
+		textviews[4] = findViewById(R.id.TextViewForumMessagesSb);
+		seekbars[0] = findViewById(R.id.seekBarContacts);
+		seekbars[1] = findViewById(R.id.seekBarMessages);
+		seekbars[2] = findViewById(R.id.seekBarBlogPosts);
+		seekbars[3] = findViewById(R.id.seekBarForums);
+		seekbars[4] = findViewById(R.id.seekBarForumMessages);
+
+		for (int i = 0; i < 5; i++) {
+			final TextView textView = textviews[i];
+			seekbars[i].setOnSeekBarChangeListener(
+					new OnSeekBarChangeListener() {
+						@Override
+						public void onProgressChanged(SeekBar seekBar,
+								int progress,
+								boolean fromUser) {
+							textView.setText("" + progress);
+						}
+
+						@Override
+						public void onStartTrackingTouch(SeekBar seekBar) {
+						}
+
+						@Override
+						public void onStopTrackingTouch(SeekBar seekBar) {
+						}
+
+					});
+		}
+
+		findViewById(R.id.buttonCreateTestData).setOnClickListener(
+				v -> {
+					createTestData();
+				});
+	}
+
+	private void createTestData() {
+		testDataCreator.createTestData(seekbars[0].getProgress(),
+				seekbars[1].getProgress(), seekbars[2].getProgress(),
+				seekbars[3].getProgress(), seekbars[4].getProgress());
+		Intent intent = new Intent(this, NavDrawerActivity.class);
+		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+		startActivity(intent);
+		finish();
+	}
+
+	@Override
+	public void injectActivity(ActivityComponent component) {
+		component.inject(this);
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item) {
+		if (item.getItemId() == android.R.id.home) {
+			onBackPressed();
+			return true;
+		}
+		return false;
+	}
+}
diff --git a/briar-android/src/main/res/layout/activity_test_data.xml b/briar-android/src/main/res/layout/activity_test_data.xml
new file mode 100644
index 0000000000..c0d6c68334
--- /dev/null
+++ b/briar-android/src/main/res/layout/activity_test_data.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent">
+
+	<ScrollView
+		android:layout_width="match_parent"
+		android:layout_height="0dp"
+		android:padding="8dp">
+
+		<android.support.constraint.ConstraintLayout
+			xmlns:android="http://schemas.android.com/apk/res/android"
+			xmlns:app="http://schemas.android.com/apk/res-auto"
+			android:layout_width="match_parent"
+			android:layout_height="match_parent">
+
+			<TextView
+				android:id="@+id/textViewContacts"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of contacts"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toTopOf="parent"/>
+
+			<SeekBar
+				android:id="@+id/seekBarContacts"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:progress="20"
+				app:layout_constraintEnd_toStartOf="@+id/textViewContactsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewContacts"/>
+
+			<TextView
+				android:id="@+id/textViewContactsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarContacts"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+
+			<TextView
+				android:id="@+id/textViewMessages"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of messages per contact"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarContacts"/>
+
+			<SeekBar
+				android:id="@+id/seekBarMessages"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="15"
+				app:layout_constraintEnd_toStartOf="@+id/textViewMessagesSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewMessages"/>
+
+			<TextView
+				android:id="@+id/textViewMessagesSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarMessages"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewBlogPosts"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of blog posts"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarMessages"/>
+
+			<SeekBar
+				android:id="@+id/seekBarBlogPosts"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="30"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewBlogPostsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewBlogPosts"/>
+
+			<TextView
+				android:id="@+id/TextViewBlogPostsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarBlogPosts"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewForums"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of forums"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarBlogPosts"/>
+
+			<SeekBar
+				android:id="@+id/seekBarForums"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="10"
+				android:paddingTop="5dp"
+				android:progress="3"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewForumsSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewForums"/>
+
+			<TextView
+				android:id="@+id/TextViewForumsSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarForums"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<TextView
+				android:id="@+id/textViewForumMessages"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:text="Number of forum messages"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarForums"/>
+
+			<SeekBar
+				android:id="@+id/seekBarForumMessages"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:max="50"
+				android:paddingTop="5dp"
+				android:progress="30"
+				app:layout_constraintEnd_toStartOf="@+id/TextViewForumMessagesSb"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/textViewForumMessages"/>
+
+			<TextView
+				android:id="@+id/TextViewForumMessagesSb"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:ems="2"
+				android:text="20"
+				app:layout_constraintBottom_toBottomOf="@+id/seekBarForumMessages"
+				app:layout_constraintEnd_toEndOf="parent"/>
+
+			<Button
+				android:id="@+id/buttonCreateTestData"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_margin="10dp"
+				android:text="Create test data"
+				app:layout_constraintEnd_toEndOf="parent"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintTop_toBottomOf="@+id/seekBarForumMessages"/>
+		</android.support.constraint.ConstraintLayout>
+	</ScrollView>
+</android.support.constraint.ConstraintLayout>
diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml
index 43ad96985a..9f3a55f94f 100644
--- a/briar-android/src/main/res/xml/settings.xml
+++ b/briar-android/src/main/res/xml/settings.xml
@@ -124,6 +124,11 @@
 
 	<Preference
 		android:key="pref_key_test_data"
-		android:title="Create Test Data"/>
+		android:title="Create Test Data">
 
-</PreferenceScreen>
\ No newline at end of file
+		<intent
+			android:targetClass="org.briarproject.briar.android.test.TestDataActivity"
+			android:targetPackage="@string/app_package"/>
+	</Preference>
+
+</PreferenceScreen>
diff --git a/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java b/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
index 55b77221d2..5bae29a83d 100644
--- a/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
+++ b/briar-api/src/main/java/org/briarproject/briar/api/test/TestDataCreator.java
@@ -8,4 +8,17 @@ public interface TestDataCreator {
 	/* Creates fake test data on the DatabaseExecutor */
 	void createTestData();
 
+	/**
+	 * Creates a configurable amount of fake test data on the DatabaseExecutor
+	 *
+	 * @param numContacts Number of contacts to create.
+	 * @param numPrivateMsgs Number of private messages to create for each
+	 * contact.
+	 * @param numBlogPosts Number of blog posts to create.
+	 * @param numForums Number of forums to create.
+	 * @param numForumPosts Number of forum posts to create per forum.
+	 */
+	void createTestData(int numContacts, int numPrivateMsgs, int numBlogPosts,
+			int numForums, int numForumPosts);
+
 }
diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
index c090feefda..c273001e17 100644
--- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
@@ -61,12 +61,6 @@ import static org.briarproject.briar.test.TestData.GROUP_NAMES;
 
 public class TestDataCreatorImpl implements TestDataCreator {
 
-	private final static int NUM_CONTACTS = 20;
-	private final static int NUM_PRIVATE_MSGS = 15;
-	private final static int NUM_BLOG_POSTS = 30;
-	private final static int NUM_FORUMS = 3;
-	private final static int NUM_FORUM_POSTS = 30;
-
 	private final Logger LOG =
 			Logger.getLogger(TestDataCreatorImpl.class.getName());
 
@@ -92,6 +86,12 @@ public class TestDataCreatorImpl implements TestDataCreator {
 	private final Random random = new Random();
 	private final Map<Contact, LocalAuthor> localAuthors = new HashMap<>();
 
+	private int numContacts = 20;
+	private int numPrivateMsgs = 15;
+	private int numBlogPosts = 30;
+	private int numForums = 3;
+	private int numForumPosts = 30;
+
 	@Inject
 	TestDataCreatorImpl(AuthorFactory authorFactory, Clock clock,
 			PrivateMessageFactory privateMessageFactory,
@@ -119,6 +119,16 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		this.ioExecutor = ioExecutor;
 	}
 
+	public void createTestData(int numContacts, int numPrivateMsgs, int numBlogPosts, int numForums,
+			int numForumPosts){
+		this.numContacts = numContacts;
+		this.numPrivateMsgs = numPrivateMsgs;
+		this.numBlogPosts = numBlogPosts;
+		this.numForums = numForums;
+		this.numForumPosts = numForumPosts;
+		createTestData();
+	}
+
 	public void createTestData() {
 		ioExecutor.execute(() -> {
 			try {
@@ -143,9 +153,9 @@ public class TestDataCreatorImpl implements TestDataCreator {
 	}
 
 	private List<Contact> createContacts() throws DbException {
-		List<Contact> contacts = new ArrayList<>(NUM_CONTACTS);
+		List<Contact> contacts = new ArrayList<>(numContacts);
 		LocalAuthor localAuthor = identityManager.getLocalAuthor();
-		for (int i = 0; i < NUM_CONTACTS; i++) {
+		for (int i = 0; i < numContacts; i++) {
 			Contact contact = addRandomContact(localAuthor);
 			contacts.add(contact);
 		}
@@ -210,7 +220,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		String btAddress = getRandomBluetoothAddress();
 		String uuid = getRandomUUID();
 		bt.put(BluetoothConstants.PROP_ADDRESS, btAddress);
-		bt.put(BluetoothConstants.PROP_UUID,uuid);
+		bt.put(BluetoothConstants.PROP_UUID, uuid);
 		props.put(BluetoothConstants.ID, bt);
 
 		// LAN
@@ -275,7 +285,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			throws DbException {
 		for (Contact contact : contacts) {
 			Group group = messagingManager.getContactGroup(contact);
-			for (int i = 0; i < NUM_PRIVATE_MSGS; i++) {
+			for (int i = 0; i < numPrivateMsgs; i++) {
 				try {
 					createPrivateMessage(group.getId(), i);
 				} catch (FormatException e) {
@@ -284,7 +294,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			}
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_PRIVATE_MSGS +
+			LOG.info("Created " + numPrivateMsgs +
 					" private messages per contact.");
 		}
 	}
@@ -315,13 +325,13 @@ public class TestDataCreatorImpl implements TestDataCreator {
 
 	private void createBlogPosts(List<Contact> contacts)
 			throws DbException {
-		for (int i = 0; i < NUM_BLOG_POSTS; i++) {
+		for (int i = 0; i < numBlogPosts; i++) {
 			Contact contact = contacts.get(random.nextInt(contacts.size()));
 			LocalAuthor author = localAuthors.get(contact);
 			addBlogPost(author, i);
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_BLOG_POSTS + " blog posts.");
+			LOG.info("Created " + numBlogPosts + " blog posts.");
 		}
 	}
 
@@ -341,8 +351,8 @@ public class TestDataCreatorImpl implements TestDataCreator {
 
 	private List<Forum> createForums(List<Contact> contacts)
 			throws DbException {
-		List<Forum> forums = new ArrayList<>(NUM_FORUMS);
-		for (int i = 0; i < NUM_FORUMS; i++) {
+		List<Forum> forums = new ArrayList<>(numForums);
+		for (int i = 0; i < numForums; i++) {
 			// create forum
 			String name = GROUP_NAMES[random.nextInt(GROUP_NAMES.length)];
 			Forum forum = forumManager.addForum(name);
@@ -361,8 +371,8 @@ public class TestDataCreatorImpl implements TestDataCreator {
 			forums.add(forum);
 		}
 		if (LOG.isLoggable(INFO)) {
-			LOG.info("Created " + NUM_FORUMS + " forums with " +
-					NUM_FORUM_POSTS + " posts each.");
+			LOG.info("Created " + numForums + " forums with " +
+					numForumPosts + " posts each.");
 		}
 		return forums;
 	}
@@ -370,7 +380,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 	private void createRandomForumPosts(Forum forum, List<Contact> contacts)
 			throws DbException {
 		List<ForumPost> posts = new ArrayList<>();
-		for (int i = 0; i < NUM_FORUM_POSTS; i++) {
+		for (int i = 0; i < numForumPosts; i++) {
 			Contact contact = contacts.get(random.nextInt(contacts.size()));
 			LocalAuthor author = localAuthors.get(contact);
 			long timestamp = clock.currentTimeMillis() - i * 60 * 1000;
-- 
GitLab