From 0cebc42ddbb5b6651651c6c3d84be48259410f48 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Thu, 9 Jan 2014 12:42:19 +0000
Subject: [PATCH] Padding now depends on screen size. Closes dev task #57.

---
 briar-android/res/values-v11/styles.xml       |  1 -
 briar-android/res/values/styles.xml           |  1 -
 .../android/HomeScreenActivity.java           | 20 ++++++++++++----
 .../briarproject/android/SetupActivity.java   | 14 ++++++-----
 .../android/contact/ContactListAdapter.java   | 11 ++++++---
 .../android/contact/ConversationAdapter.java  |  9 +++++--
 .../contact/ReadPrivateMessageActivity.java   | 18 ++++++++------
 .../contact/WritePrivateMessageActivity.java  | 12 ++++++----
 .../android/groups/CreateGroupActivity.java   |  6 ++++-
 .../android/groups/GroupAdapter.java          |  9 +++++--
 .../android/groups/GroupListActivity.java     |  8 +++----
 .../android/groups/GroupListAdapter.java      | 12 ++++++----
 .../android/groups/ManageGroupsAdapter.java   | 12 ++++++----
 .../android/groups/ReadGroupPostActivity.java | 18 ++++++++------
 .../groups/WriteGroupPostActivity.java        | 12 ++++++----
 .../identity/CreateIdentityActivity.java      |  6 ++++-
 .../identity/LocalAuthorSpinnerAdapter.java   |  1 +
 .../android/invitation/AddContactView.java    |  6 +++++
 .../invitation/BluetoothStatusView.java       | 16 +++++++++----
 .../android/invitation/CodeEntryView.java     |  8 ++++++-
 .../invitation/CodesDoNotMatchView.java       |  6 +++--
 .../invitation/ConfirmationCodeView.java      |  8 ++++---
 .../android/invitation/ConnectedView.java     |  4 ++--
 .../invitation/ConnectionFailedView.java      |  6 +++--
 .../android/invitation/ConnectionView.java    | 10 ++++----
 .../invitation/ContactDetailsView.java        |  8 +++----
 .../invitation/InvitationCodeView.java        |  4 ++--
 .../android/invitation/NetworkSetupView.java  |  4 ++--
 .../invitation/WaitForContactView.java        |  8 +++----
 .../android/invitation/WifiStatusView.java    | 16 +++++++++----
 ...Space.java => ElasticHorizontalSpace.java} |  4 ++--
 .../android/util/FixedVerticalSpace.java      | 15 ++++++++++++
 .../android/util/HorizontalBorder.java        |  6 ++---
 .../android/util/LayoutUtils.java             | 24 +++++++++++++++++++
 34 files changed, 227 insertions(+), 96 deletions(-)
 rename briar-android/src/org/briarproject/android/util/{HorizontalSpace.java => ElasticHorizontalSpace.java} (74%)
 create mode 100644 briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java
 create mode 100644 briar-android/src/org/briarproject/android/util/LayoutUtils.java

diff --git a/briar-android/res/values-v11/styles.xml b/briar-android/res/values-v11/styles.xml
index dbc0841459..12c9ddd648 100644
--- a/briar-android/res/values-v11/styles.xml
+++ b/briar-android/res/values-v11/styles.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 	<style name="LightTheme" parent="android:Theme.Holo.Light" />
-	<integer name="horizontal_border_width">5</integer>
 	<integer name="spinner_padding">10</integer>
 </resources>
\ No newline at end of file
diff --git a/briar-android/res/values/styles.xml b/briar-android/res/values/styles.xml
index a65656192c..07556eda81 100644
--- a/briar-android/res/values/styles.xml
+++ b/briar-android/res/values/styles.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 	<style name="LightTheme" parent="android:Theme.Light" />
-	<integer name="horizontal_border_width">2</integer>
 	<integer name="spinner_padding">0</integer>
 </resources>
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/HomeScreenActivity.java b/briar-android/src/org/briarproject/android/HomeScreenActivity.java
index 909b948e45..7024486e5b 100644
--- a/briar-android/src/org/briarproject/android/HomeScreenActivity.java
+++ b/briar-android/src/org/briarproject/android/HomeScreenActivity.java
@@ -27,6 +27,8 @@ import org.briarproject.android.BriarService.BriarBinder;
 import org.briarproject.android.BriarService.BriarServiceConnection;
 import org.briarproject.android.contact.ContactListActivity;
 import org.briarproject.android.groups.GroupListActivity;
+import org.briarproject.android.util.FixedVerticalSpace;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.android.DatabaseUiExecutor;
 import org.briarproject.api.android.ReferenceManager;
@@ -198,10 +200,12 @@ public class HomeScreenActivity extends RoboActivity {
 		layout.setOrientation(VERTICAL);
 		layout.setGravity(CENTER_HORIZONTAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		enterPassword = new TextView(this);
 		enterPassword.setGravity(CENTER);
 		enterPassword.setTextSize(18);
-		enterPassword.setPadding(10, 10, 10, 0);
+		enterPassword.setPadding(pad, pad, pad, 0);
 		enterPassword.setText(R.string.enter_password);
 		layout.addView(enterPassword);
 
@@ -218,6 +222,9 @@ public class HomeScreenActivity extends RoboActivity {
 		});
 		layout.addView(passwordEntry);
 
+		// Adjusting the padding of buttons and EditTexts has the wrong results
+		layout.addView(new FixedVerticalSpace(this));
+
 		continueButton = new Button(this);
 		continueButton.setLayoutParams(WRAP_WRAP);
 		continueButton.setText(R.string.continue_button);
@@ -230,7 +237,6 @@ public class HomeScreenActivity extends RoboActivity {
 
 		progress = new ProgressBar(this);
 		progress.setLayoutParams(WRAP_WRAP);
-		progress.setPadding(0, 10, 0, 0);
 		progress.setIndeterminate(true);
 		progress.setVisibility(GONE);
 		layout.addView(progress);
@@ -288,12 +294,16 @@ public class HomeScreenActivity extends RoboActivity {
 		LinearLayout layout = new LinearLayout(this);
 		layout.setLayoutParams(MATCH_MATCH);
 		layout.setGravity(CENTER);
+
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView warning = new TextView(this);
 		warning.setGravity(CENTER);
 		warning.setTextSize(18);
-		warning.setPadding(10, 10, 10, 10);
+		warning.setPadding(pad, pad, pad, pad);
 		warning.setText(R.string.expiry_warning);
 		layout.addView(warning);
+
 		setContentView(layout);
 	}
 
@@ -359,10 +369,12 @@ public class HomeScreenActivity extends RoboActivity {
 		});
 		buttons.add(quitButton);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		GridView grid = new GridView(this);
 		grid.setLayoutParams(matchMatch);
 		grid.setGravity(CENTER);
-		grid.setPadding(5, 5, 5, 5);
+		grid.setPadding(pad, pad, pad, pad);
 		grid.setBackgroundColor(getResources().getColor(
 				R.color.home_screen_background));
 		grid.setNumColumns(2);
diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java
index a9e5681904..5aef39a828 100644
--- a/briar-android/src/org/briarproject/android/SetupActivity.java
+++ b/briar-android/src/org/briarproject/android/SetupActivity.java
@@ -19,6 +19,7 @@ import java.util.concurrent.Executor;
 import javax.inject.Inject;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.android.util.StrengthMeter;
 import org.briarproject.api.AuthorFactory;
 import org.briarproject.api.LocalAuthor;
@@ -70,10 +71,12 @@ public class SetupActivity extends RoboActivity implements OnClickListener {
 		layout.setOrientation(VERTICAL);
 		layout.setGravity(CENTER_HORIZONTAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView chooseNickname = new TextView(this);
 		chooseNickname.setGravity(CENTER);
 		chooseNickname.setTextSize(18);
-		chooseNickname.setPadding(10, 10, 10, 0);
+		chooseNickname.setPadding(pad, pad, pad, 0);
 		chooseNickname.setText(R.string.choose_nickname);
 		layout.addView(chooseNickname);
 
@@ -93,7 +96,7 @@ public class SetupActivity extends RoboActivity implements OnClickListener {
 		TextView choosePassword = new TextView(this);
 		choosePassword.setGravity(CENTER);
 		choosePassword.setTextSize(18);
-		choosePassword.setPadding(10, 10, 10, 0);
+		choosePassword.setPadding(pad, pad, pad, 0);
 		choosePassword.setText(R.string.choose_password);
 		layout.addView(choosePassword);
 
@@ -113,7 +116,7 @@ public class SetupActivity extends RoboActivity implements OnClickListener {
 		TextView confirmPassword = new TextView(this);
 		confirmPassword.setGravity(CENTER);
 		confirmPassword.setTextSize(18);
-		confirmPassword.setPadding(10, 10, 10, 0);
+		confirmPassword.setPadding(pad, pad, pad, 0);
 		confirmPassword.setText(R.string.confirm_password);
 		layout.addView(confirmPassword);
 
@@ -131,13 +134,13 @@ public class SetupActivity extends RoboActivity implements OnClickListener {
 		layout.addView(passwordConfirmation);
 
 		strengthMeter = new StrengthMeter(this);
-		strengthMeter.setPadding(30, 10, 30, 0);
+		strengthMeter.setPadding(5 * pad, pad, 5 * pad, 0);
 		layout.addView(strengthMeter);
 
 		feedback = new TextView(this);
 		feedback.setGravity(CENTER);
 		feedback.setTextSize(14);
-		feedback.setPadding(10, 10, 10, 10);
+		feedback.setPadding(pad, pad, pad, pad);
 		feedback.setText("");
 		layout.addView(feedback);
 
@@ -150,7 +153,6 @@ public class SetupActivity extends RoboActivity implements OnClickListener {
 
 		progress = new ProgressBar(this);
 		progress.setLayoutParams(WRAP_WRAP);
-		progress.setPadding(0, 10, 0, 0);
 		progress.setIndeterminate(true);
 		progress.setVisibility(GONE);
 		layout.addView(progress);
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
index 83f1ae127c..e02799b6e4 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
@@ -7,6 +7,8 @@ import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
 import java.util.ArrayList;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.Html;
@@ -20,9 +22,12 @@ import android.widget.TextView;
 
 class ContactListAdapter extends ArrayAdapter<ContactListItem> {
 
+	private final int pad;
+
 	ContactListAdapter(Context ctx) {
 		super(ctx, android.R.layout.simple_expandable_list_item_1,
 				new ArrayList<ContactListItem>());
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	@Override
@@ -37,7 +42,7 @@ class ContactListAdapter extends ArrayAdapter<ContactListItem> {
 			layout.setBackgroundColor(res.getColor(R.color.unread_background));
 
 		ImageView bulb = new ImageView(ctx);
-		bulb.setPadding(5, 5, 5, 5);
+		bulb.setPadding(pad, pad, pad, pad);
 		if(item.isConnected())
 			bulb.setImageResource(R.drawable.contact_connected);
 		else bulb.setImageResource(R.drawable.contact_disconnected);
@@ -48,7 +53,7 @@ class ContactListAdapter extends ArrayAdapter<ContactListItem> {
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(0, 10, 10, 10);
+		name.setPadding(0, pad, pad, pad);
 		int unread = item.getUnreadCount();
 		String contactName = item.getContact().getAuthor().getName();
 		if(unread > 0) name.setText(contactName + " (" + unread + ")");
@@ -57,7 +62,7 @@ class ContactListAdapter extends ArrayAdapter<ContactListItem> {
 
 		TextView connected = new TextView(ctx);
 		connected.setTextSize(14);
-		connected.setPadding(0, 10, 10, 10);
+		connected.setPadding(0, pad, pad, pad);
 		if(item.isConnected()) {
 			connected.setText(R.string.contact_connected);
 		} else {
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index 4d08434ce4..d36a862bdc 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -7,7 +7,9 @@ import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
 import java.util.ArrayList;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.db.MessageHeader;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.format.DateUtils;
@@ -19,9 +21,12 @@ import android.widget.TextView;
 
 class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 
+	private final int pad;
+
 	ConversationAdapter(Context ctx) {
 		super(ctx, android.R.layout.simple_expandable_list_item_1,
 				new ArrayList<ConversationItem>());
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	@Override
@@ -41,13 +46,13 @@ class ConversationAdapter extends ArrayAdapter<ConversationItem> {
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(10, 10, 10, 10);
+		name.setPadding(pad, pad, pad, pad);
 		name.setText(header.getAuthor().getName());
 		layout.addView(name);
 
 		TextView date = new TextView(ctx);
 		date.setTextSize(14);
-		date.setPadding(0, 10, 10, 10);
+		date.setPadding(0, pad, pad, pad);
 		long then = header.getTimestamp(), now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 		layout.addView(date);
diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
index 5745d4a9b8..ee27a2d850 100644
--- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java
@@ -19,7 +19,8 @@ import javax.inject.Inject;
 
 import org.briarproject.R;
 import org.briarproject.android.util.HorizontalBorder;
-import org.briarproject.android.util.HorizontalSpace;
+import org.briarproject.android.util.ElasticHorizontalSpace;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.AuthorId;
 import org.briarproject.api.android.DatabaseUiExecutor;
 import org.briarproject.api.db.DatabaseComponent;
@@ -28,6 +29,7 @@ import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.messaging.MessageId;
+
 import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -114,18 +116,20 @@ implements OnClickListener {
 		header.setOrientation(HORIZONTAL);
 		header.setGravity(CENTER_VERTICAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView name = new TextView(this);
 		// Give me all the unused width
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(10, 10, 10, 10);
+		name.setPadding(pad, pad, pad, pad);
 		name.setText(authorName);
 		header.addView(name);
 
 		TextView date = new TextView(this);
 		date.setTextSize(14);
-		date.setPadding(0, 10, 10, 10);
+		date.setPadding(0, pad, pad, pad);
 		long now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(timestamp, now, SHORT, SHORT));
 		header.addView(date);
@@ -134,7 +138,7 @@ implements OnClickListener {
 		if(contentType.equals("text/plain")) {
 			// Load and display the message body
 			content = new TextView(this);
-			content.setPadding(10, 0, 10, 10);
+			content.setPadding(pad, 0, pad, pad);
 			message.addView(content);
 			loadMessageBody();
 		}
@@ -154,21 +158,21 @@ implements OnClickListener {
 		else readButton.setImageResource(R.drawable.content_read);
 		readButton.setOnClickListener(this);
 		footer.addView(readButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		prevButton = new ImageButton(this);
 		prevButton.setBackgroundResource(0);
 		prevButton.setImageResource(R.drawable.navigation_previous_item);
 		prevButton.setOnClickListener(this);
 		footer.addView(prevButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		nextButton = new ImageButton(this);
 		nextButton.setBackgroundResource(0);
 		nextButton.setImageResource(R.drawable.navigation_next_item);
 		nextButton.setOnClickListener(this);
 		footer.addView(nextButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		replyButton = new ImageButton(this);
 		replyButton.setBackgroundResource(0);
diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
index bf671b63ed..847a472ff0 100644
--- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java
@@ -19,7 +19,8 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import org.briarproject.R;
-import org.briarproject.android.util.HorizontalSpace;
+import org.briarproject.android.util.ElasticHorizontalSpace;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.AuthorId;
 import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.android.DatabaseUiExecutor;
@@ -34,6 +35,7 @@ import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.messaging.Message;
 import org.briarproject.api.messaging.MessageFactory;
 import org.briarproject.api.messaging.MessageId;
+
 import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -97,13 +99,15 @@ implements OnClickListener {
 		header.setOrientation(HORIZONTAL);
 		header.setGravity(CENTER_VERTICAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		from = new TextView(this);
 		from.setTextSize(18);
-		from.setPadding(10, 10, 10, 10);
+		from.setPadding(pad, pad, pad, pad);
 		from.setText(R.string.from);
 		header.addView(from);
 
-		header.addView(new HorizontalSpace(this));
+		header.addView(new ElasticHorizontalSpace(this));
 
 		sendButton = new ImageButton(this);
 		sendButton.setBackgroundResource(0);
@@ -115,7 +119,7 @@ implements OnClickListener {
 
 		to = new TextView(this);
 		to.setTextSize(18);
-		to.setPadding(10, 0, 10, 10);
+		to.setPadding(pad, 0, pad, pad);
 		String format = getResources().getString(R.string.format_to);
 		to.setText(String.format(format, contactName));
 		layout.addView(to);
diff --git a/briar-android/src/org/briarproject/android/groups/CreateGroupActivity.java b/briar-android/src/org/briarproject/android/groups/CreateGroupActivity.java
index d227059f07..5474b05a19 100644
--- a/briar-android/src/org/briarproject/android/groups/CreateGroupActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/CreateGroupActivity.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 import org.briarproject.R;
 import org.briarproject.android.contact.SelectContactsDialog;
 import org.briarproject.android.invitation.AddContactActivity;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.Contact;
 import org.briarproject.api.ContactId;
 import org.briarproject.api.android.DatabaseUiExecutor;
@@ -31,6 +32,7 @@ import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.messaging.Group;
 import org.briarproject.api.messaging.GroupFactory;
+
 import roboguice.activity.RoboFragmentActivity;
 import android.content.Intent;
 import android.os.Bundle;
@@ -79,10 +81,12 @@ SelectContactsDialog.Listener {
 		layout.setOrientation(VERTICAL);
 		layout.setGravity(CENTER_HORIZONTAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView chooseName = new TextView(this);
 		chooseName.setGravity(CENTER);
 		chooseName.setTextSize(18);
-		chooseName.setPadding(10, 10, 10, 0);
+		chooseName.setPadding(pad, pad, pad, 0);
 		chooseName.setText(R.string.choose_forum_name);
 		layout.addView(chooseName);
 
diff --git a/briar-android/src/org/briarproject/android/groups/GroupAdapter.java b/briar-android/src/org/briarproject/android/groups/GroupAdapter.java
index 1b9b446ef6..4900e2f3e1 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupAdapter.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupAdapter.java
@@ -7,8 +7,10 @@ import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
 import java.util.ArrayList;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.Author;
 import org.briarproject.api.db.MessageHeader;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.format.DateUtils;
@@ -20,9 +22,12 @@ import android.widget.TextView;
 
 class GroupAdapter extends ArrayAdapter<MessageHeader> {
 
+	private final int pad;
+
 	GroupAdapter(Context ctx) {
 		super(ctx, android.R.layout.simple_expandable_list_item_1,
 				new ArrayList<MessageHeader>());
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	@Override
@@ -41,7 +46,7 @@ class GroupAdapter extends ArrayAdapter<MessageHeader> {
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(10, 10, 10, 10);
+		name.setPadding(pad, pad, pad, pad);
 		Author author = item.getAuthor();
 		if(author == null) {
 			name.setTextColor(res.getColor(R.color.anonymous_author));
@@ -53,7 +58,7 @@ class GroupAdapter extends ArrayAdapter<MessageHeader> {
 
 		TextView date = new TextView(ctx);
 		date.setTextSize(14);
-		date.setPadding(10, 10, 10, 10);
+		date.setPadding(pad, pad, pad, pad);
 		long then = item.getTimestamp(), now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 		layout.addView(date);
diff --git a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
index 6dbd585f67..d61c4148e8 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupListActivity.java
@@ -24,7 +24,7 @@ import javax.inject.Inject;
 
 import org.briarproject.R;
 import org.briarproject.android.util.HorizontalBorder;
-import org.briarproject.android.util.HorizontalSpace;
+import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.ListLoadingProgressBar;
 import org.briarproject.api.android.DatabaseUiExecutor;
 import org.briarproject.api.db.DatabaseComponent;
@@ -99,21 +99,21 @@ implements EventListener, OnClickListener, OnItemClickListener {
 		footer.setLayoutParams(MATCH_WRAP);
 		footer.setOrientation(HORIZONTAL);
 		footer.setGravity(CENTER);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		newGroupButton = new ImageButton(this);
 		newGroupButton.setBackgroundResource(0);
 		newGroupButton.setImageResource(R.drawable.social_new_chat);
 		newGroupButton.setOnClickListener(this);
 		footer.addView(newGroupButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		manageGroupsButton = new ImageButton(this);
 		manageGroupsButton.setBackgroundResource(0);
 		manageGroupsButton.setImageResource(R.drawable.action_settings);
 		manageGroupsButton.setOnClickListener(this);
 		footer.addView(manageGroupsButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 		layout.addView(footer);
 
 		setContentView(layout);
diff --git a/briar-android/src/org/briarproject/android/groups/GroupListAdapter.java b/briar-android/src/org/briarproject/android/groups/GroupListAdapter.java
index 7bcb6ad56d..e9ee80b986 100644
--- a/briar-android/src/org/briarproject/android/groups/GroupListAdapter.java
+++ b/briar-android/src/org/briarproject/android/groups/GroupListAdapter.java
@@ -12,6 +12,8 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.text.format.DateUtils;
@@ -24,11 +26,13 @@ import android.widget.TextView;
 class GroupListAdapter extends BaseAdapter {
 
 	private final Context ctx;
+	private final int pad;
 	private final List<GroupListItem> list = new ArrayList<GroupListItem>();
 	private int available = 0;
 
 	GroupListAdapter(Context ctx) {
 		this.ctx = ctx;
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	public void setAvailable(int available) {
@@ -63,7 +67,7 @@ class GroupListAdapter extends BaseAdapter {
 			TextView manage = new TextView(ctx);
 			manage.setGravity(CENTER);
 			manage.setTextSize(18);
-			manage.setPadding(10, 10, 10, 10);
+			manage.setPadding(pad, pad, pad, pad);
 			String format = res.getQuantityString(R.plurals.forums_available,
 					available);
 			manage.setText(String.format(format, available));
@@ -80,7 +84,7 @@ class GroupListAdapter extends BaseAdapter {
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(10, 10, 10, 10);
+		name.setPadding(pad, pad, pad, pad);
 		int unread = item.getUnreadCount();
 		String groupName = item.getGroup().getName();
 		if(unread > 0) name.setText(groupName + " (" + unread + ")");
@@ -90,14 +94,14 @@ class GroupListAdapter extends BaseAdapter {
 		if(item.isEmpty()) {
 			TextView noPosts = new TextView(ctx);
 			noPosts.setTextSize(14);
-			noPosts.setPadding(10, 0, 10, 10);
+			noPosts.setPadding(pad, 0, pad, pad);
 			noPosts.setTextColor(res.getColor(R.color.no_posts));
 			noPosts.setText(R.string.no_posts);
 			layout.addView(noPosts);
 		} else {
 			TextView date = new TextView(ctx);
 			date.setTextSize(14);
-			date.setPadding(10, 0, 10, 10);
+			date.setPadding(pad, 0, pad, pad);
 			long then = item.getTimestamp(), now = System.currentTimeMillis();
 			date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT));
 			layout.addView(date);
diff --git a/briar-android/src/org/briarproject/android/groups/ManageGroupsAdapter.java b/briar-android/src/org/briarproject/android/groups/ManageGroupsAdapter.java
index a3c115e385..f6dd5eade9 100644
--- a/briar-android/src/org/briarproject/android/groups/ManageGroupsAdapter.java
+++ b/briar-android/src/org/briarproject/android/groups/ManageGroupsAdapter.java
@@ -12,7 +12,9 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.messaging.GroupStatus;
+
 import android.content.Context;
 import android.view.View;
 import android.view.ViewGroup;
@@ -24,11 +26,13 @@ import android.widget.TextView;
 class ManageGroupsAdapter extends BaseAdapter {
 
 	private final Context ctx;
+	private final int pad;
 	private final List<ManageGroupsItem> list =
 			new ArrayList<ManageGroupsItem>();
 
 	ManageGroupsAdapter(Context ctx) {
 		this.ctx = ctx;
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	public void add(ManageGroupsItem item) {
@@ -58,7 +62,7 @@ class ManageGroupsAdapter extends BaseAdapter {
 			TextView none = new TextView(ctx);
 			none.setGravity(CENTER);
 			none.setTextSize(18);
-			none.setPadding(10, 10, 10, 10);
+			none.setPadding(pad, pad, pad, pad);
 			none.setText(R.string.no_forums_available);
 			return none;
 		}
@@ -68,7 +72,7 @@ class ManageGroupsAdapter extends BaseAdapter {
 		layout.setOrientation(HORIZONTAL);
 
 		ImageView subscribed = new ImageView(ctx);
-		subscribed.setPadding(5, 5, 5, 5);
+		subscribed.setPadding(pad, pad, pad, pad);
 		subscribed.setImageResource(R.drawable.navigation_accept);
 		if(!s.isSubscribed()) subscribed.setVisibility(INVISIBLE);
 		layout.addView(subscribed);
@@ -79,13 +83,13 @@ class ManageGroupsAdapter extends BaseAdapter {
 		TextView name = new TextView(ctx);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(0, 10, 10, 10);
+		name.setPadding(0, pad, pad, pad);
 		name.setText(s.getGroup().getName());
 		innerLayout.addView(name);
 
 		TextView status = new TextView(ctx);
 		status.setTextSize(14);
-		status.setPadding(0, 0, 10, 10);
+		status.setPadding(0, 0, pad, pad);
 		if(s.isSubscribed()) {
 			if(s.isVisibleToAll()) status.setText(R.string.subscribed_all);
 			else status.setText(R.string.subscribed_some);
diff --git a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
index 00910319f1..6284aab728 100644
--- a/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/ReadGroupPostActivity.java
@@ -19,7 +19,8 @@ import javax.inject.Inject;
 
 import org.briarproject.R;
 import org.briarproject.android.util.HorizontalBorder;
-import org.briarproject.android.util.HorizontalSpace;
+import org.briarproject.android.util.ElasticHorizontalSpace;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.android.DatabaseUiExecutor;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
@@ -27,6 +28,7 @@ import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.messaging.MessageId;
+
 import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -107,12 +109,14 @@ implements OnClickListener {
 		header.setOrientation(HORIZONTAL);
 		header.setGravity(CENTER_VERTICAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView name = new TextView(this);
 		// Give me all the unused width
 		name.setLayoutParams(WRAP_WRAP_1);
 		name.setTextSize(18);
 		name.setMaxLines(1);
-		name.setPadding(10, 10, 10, 10);
+		name.setPadding(pad, pad, pad, pad);
 		if(authorName == null) {
 			name.setTextColor(res.getColor(R.color.anonymous_author));
 			name.setText(R.string.anonymous);
@@ -123,7 +127,7 @@ implements OnClickListener {
 
 		TextView date = new TextView(this);
 		date.setTextSize(14);
-		date.setPadding(0, 10, 10, 10);
+		date.setPadding(0, pad, pad, pad);
 		long now = System.currentTimeMillis();
 		date.setText(DateUtils.formatSameDayTime(timestamp, now, SHORT, SHORT));
 		header.addView(date);
@@ -132,7 +136,7 @@ implements OnClickListener {
 		if(contentType.equals("text/plain")) {
 			// Load and display the message body
 			content = new TextView(this);
-			content.setPadding(10, 0, 10, 10);
+			content.setPadding(pad, 0, pad, pad);
 			message.addView(content);
 			loadMessageBody();
 		}
@@ -152,21 +156,21 @@ implements OnClickListener {
 		else readButton.setImageResource(R.drawable.content_read);
 		readButton.setOnClickListener(this);
 		footer.addView(readButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		prevButton = new ImageButton(this);
 		prevButton.setBackgroundResource(0);
 		prevButton.setImageResource(R.drawable.navigation_previous_item);
 		prevButton.setOnClickListener(this);
 		footer.addView(prevButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		nextButton = new ImageButton(this);
 		nextButton.setBackgroundResource(0);
 		nextButton.setImageResource(R.drawable.navigation_next_item);
 		nextButton.setOnClickListener(this);
 		footer.addView(nextButton);
-		footer.addView(new HorizontalSpace(this));
+		footer.addView(new ElasticHorizontalSpace(this));
 
 		replyButton = new ImageButton(this);
 		replyButton.setBackgroundResource(0);
diff --git a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
index 47d6a701aa..b46e488a36 100644
--- a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
+++ b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java
@@ -24,7 +24,8 @@ import org.briarproject.android.identity.CreateIdentityActivity;
 import org.briarproject.android.identity.LocalAuthorItem;
 import org.briarproject.android.identity.LocalAuthorItemComparator;
 import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
-import org.briarproject.android.util.HorizontalSpace;
+import org.briarproject.android.util.ElasticHorizontalSpace;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.AuthorId;
 import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.android.DatabaseUiExecutor;
@@ -40,6 +41,7 @@ import org.briarproject.api.messaging.GroupId;
 import org.briarproject.api.messaging.Message;
 import org.briarproject.api.messaging.MessageFactory;
 import org.briarproject.api.messaging.MessageId;
+
 import roboguice.activity.RoboActivity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -109,9 +111,11 @@ implements OnItemSelectedListener, OnClickListener {
 		header.setOrientation(HORIZONTAL);
 		header.setGravity(CENTER_VERTICAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView from = new TextView(this);
 		from.setTextSize(18);
-		from.setPadding(10, 10, 0, 10);
+		from.setPadding(pad, pad, 0, pad);
 		from.setText(R.string.from);
 		header.addView(from);
 
@@ -121,7 +125,7 @@ implements OnItemSelectedListener, OnClickListener {
 		spinner.setOnItemSelectedListener(this);
 		header.addView(spinner);
 
-		header.addView(new HorizontalSpace(this));
+		header.addView(new ElasticHorizontalSpace(this));
 
 		sendButton = new ImageButton(this);
 		sendButton.setBackgroundResource(0);
@@ -133,7 +137,7 @@ implements OnItemSelectedListener, OnClickListener {
 
 		to = new TextView(this);
 		to.setTextSize(18);
-		to.setPadding(10, 0, 10, 10);
+		to.setPadding(pad, 0, pad, pad);
 		to.setText(R.string.to);
 		layout.addView(to);
 
diff --git a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
index d2f48d9fbc..2ae410790d 100644
--- a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
+++ b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java
@@ -19,6 +19,7 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.AuthorFactory;
 import org.briarproject.api.LocalAuthor;
 import org.briarproject.api.android.DatabaseUiExecutor;
@@ -28,6 +29,7 @@ import org.briarproject.api.crypto.KeyPair;
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.lifecycle.LifecycleManager;
+
 import roboguice.activity.RoboActivity;
 import android.os.Bundle;
 import android.view.KeyEvent;
@@ -67,10 +69,12 @@ implements OnEditorActionListener, OnClickListener {
 		layout.setOrientation(VERTICAL);
 		layout.setGravity(CENTER_HORIZONTAL);
 
+		int pad = LayoutUtils.getPadding(this);
+
 		TextView chooseNickname = new TextView(this);
 		chooseNickname.setGravity(CENTER);
 		chooseNickname.setTextSize(18);
-		chooseNickname.setPadding(10, 10, 10, 0);
+		chooseNickname.setPadding(pad, pad, pad, 0);
 		chooseNickname.setText(R.string.choose_nickname);
 		layout.addView(chooseNickname);
 
diff --git a/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java
index 186999fc0c..09f535c629 100644
--- a/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java
+++ b/briar-android/src/org/briarproject/android/identity/LocalAuthorSpinnerAdapter.java
@@ -68,6 +68,7 @@ implements SpinnerAdapter {
 		name.setTextSize(18);
 		name.setMaxLines(1);
 		Resources res = ctx.getResources();
+		// FIXME: Use LayoutUtils.getPadding() here?
 		int pad = res.getInteger(R.integer.spinner_padding);
 		name.setPadding(pad, pad, pad, pad);
 		LocalAuthorItem item = getItem(position);
diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactView.java b/briar-android/src/org/briarproject/android/invitation/AddContactView.java
index 5fdcb3059c..bd5cd38115 100644
--- a/briar-android/src/org/briarproject/android/invitation/AddContactView.java
+++ b/briar-android/src/org/briarproject/android/invitation/AddContactView.java
@@ -2,15 +2,21 @@ package org.briarproject.android.invitation;
 
 import static android.view.Gravity.CENTER_HORIZONTAL;
 import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
+
+import org.briarproject.android.util.LayoutUtils;
+
 import android.content.Context;
 import android.widget.LinearLayout;
 
 abstract class AddContactView extends LinearLayout {
 
+	protected final int pad;
+
 	protected AddContactActivity container = null;
 
 	AddContactView(Context ctx) {
 		super(ctx);
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	void init(AddContactActivity container) {
diff --git a/briar-android/src/org/briarproject/android/invitation/BluetoothStatusView.java b/briar-android/src/org/briarproject/android/invitation/BluetoothStatusView.java
index 28ecd6e1da..a91110e5ea 100644
--- a/briar-android/src/org/briarproject/android/invitation/BluetoothStatusView.java
+++ b/briar-android/src/org/briarproject/android/invitation/BluetoothStatusView.java
@@ -4,7 +4,10 @@ import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERA
 import static android.provider.Settings.ACTION_BLUETOOTH_SETTINGS;
 import static android.view.Gravity.CENTER;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
+
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+
 import android.bluetooth.BluetoothAdapter;
 import android.content.Context;
 import android.content.Intent;
@@ -17,8 +20,11 @@ import android.widget.TextView;
 
 class BluetoothStatusView extends LinearLayout implements OnClickListener {
 
+	private final int pad;
+
 	public BluetoothStatusView(Context ctx) {
 		super(ctx);
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	void init() {
@@ -33,18 +39,18 @@ class BluetoothStatusView extends LinearLayout implements OnClickListener {
 		TextView status = new TextView(ctx);
 		status.setLayoutParams(WRAP_WRAP_1);
 		status.setTextSize(14);
-		status.setPadding(10, 10, 10, 10);
+		status.setPadding(pad, pad, pad, pad);
 		BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
 		if(adapter == null) {
 			ImageView warning = new ImageView(ctx);
-			warning.setPadding(5, 5, 5, 5);
+			warning.setPadding(pad, pad, pad, pad);
 			warning.setImageResource(R.drawable.alerts_and_states_warning);
 			addView(warning);
 			status.setText(R.string.bluetooth_not_available);
 			addView(status);
 		} else if(adapter.getScanMode() == SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
 			ImageView ok = new ImageView(ctx);
-			ok.setPadding(5, 5, 5, 5);
+			ok.setPadding(pad, pad, pad, pad);
 			ok.setImageResource(R.drawable.navigation_accept);
 			addView(ok);
 			status.setText(R.string.bluetooth_discoverable);
@@ -55,7 +61,7 @@ class BluetoothStatusView extends LinearLayout implements OnClickListener {
 			addView(settings);
 		} else if(adapter.isEnabled()) {
 			ImageView warning = new ImageView(ctx);
-			warning.setPadding(5, 5, 5, 5);
+			warning.setPadding(pad, pad, pad, pad);
 			warning.setImageResource(R.drawable.alerts_and_states_warning);
 			addView(warning);
 			status.setText(R.string.bluetooth_not_discoverable);
@@ -66,7 +72,7 @@ class BluetoothStatusView extends LinearLayout implements OnClickListener {
 			addView(settings);
 		} else {
 			ImageView warning = new ImageView(ctx);
-			warning.setPadding(5, 5, 5, 5);
+			warning.setPadding(pad, pad, pad, pad);
 			warning.setImageResource(R.drawable.alerts_and_states_warning);
 			addView(warning);
 			status.setText(R.string.bluetooth_disabled);
diff --git a/briar-android/src/org/briarproject/android/invitation/CodeEntryView.java b/briar-android/src/org/briarproject/android/invitation/CodeEntryView.java
index 26f28c6101..6b330a0f41 100644
--- a/briar-android/src/org/briarproject/android/invitation/CodeEntryView.java
+++ b/briar-android/src/org/briarproject/android/invitation/CodeEntryView.java
@@ -6,7 +6,10 @@ import static android.view.Gravity.CENTER;
 import static android.view.Gravity.CENTER_HORIZONTAL;
 import static android.view.inputmethod.InputMethodManager.HIDE_IMPLICIT_ONLY;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
+
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+
 import android.content.Context;
 import android.view.KeyEvent;
 import android.view.View;
@@ -21,12 +24,15 @@ import android.widget.TextView.OnEditorActionListener;
 class CodeEntryView extends LinearLayout
 implements OnEditorActionListener, OnClickListener {
 
+	private final int pad;
+
 	private CodeEntryListener listener = null;
 	private EditText codeEntry = null;
 	private Button continueButton = null;
 
 	public CodeEntryView(Context ctx) {
 		super(ctx);
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	void init(CodeEntryListener listener, String prompt) {
@@ -38,7 +44,7 @@ implements OnEditorActionListener, OnClickListener {
 		TextView enterCode = new TextView(ctx);
 		enterCode.setGravity(CENTER_HORIZONTAL);
 		enterCode.setTextSize(14);
-		enterCode.setPadding(10, 10, 10, 0);
+		enterCode.setPadding(pad, pad, pad, 0);
 		enterCode.setText(prompt);
 		addView(enterCode);
 
diff --git a/briar-android/src/org/briarproject/android/invitation/CodesDoNotMatchView.java b/briar-android/src/org/briarproject/android/invitation/CodesDoNotMatchView.java
index c6399dd916..c62aa97479 100644
--- a/briar-android/src/org/briarproject/android/invitation/CodesDoNotMatchView.java
+++ b/briar-android/src/org/briarproject/android/invitation/CodesDoNotMatchView.java
@@ -2,7 +2,9 @@ package org.briarproject.android.invitation;
 
 import static android.view.Gravity.CENTER;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
+
 import org.briarproject.R;
+
 import android.content.Context;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -30,14 +32,14 @@ class CodesDoNotMatchView extends AddContactView implements OnClickListener {
 
 		TextView failed = new TextView(ctx);
 		failed.setTextSize(22);
-		failed.setPadding(10, 10, 10, 10);
+		failed.setPadding(pad, pad, pad, pad);
 		failed.setText(R.string.codes_do_not_match);
 		innerLayout.addView(failed);
 		addView(innerLayout);
 
 		TextView interfering = new TextView(ctx);
 		interfering.setTextSize(14);
-		interfering.setPadding(10, 0, 10, 10);
+		interfering.setPadding(pad, 0, pad, pad);
 		interfering.setText(R.string.interfering);
 		addView(interfering);
 
diff --git a/briar-android/src/org/briarproject/android/invitation/ConfirmationCodeView.java b/briar-android/src/org/briarproject/android/invitation/ConfirmationCodeView.java
index 78b886cfc0..b19ba409c6 100644
--- a/briar-android/src/org/briarproject/android/invitation/ConfirmationCodeView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ConfirmationCodeView.java
@@ -2,7 +2,9 @@ package org.briarproject.android.invitation;
 
 import static android.view.Gravity.CENTER;
 import static android.view.Gravity.CENTER_HORIZONTAL;
+
 import org.briarproject.R;
+
 import android.content.Context;
 import android.content.res.Resources;
 import android.widget.ImageView;
@@ -28,7 +30,7 @@ class ConfirmationCodeView extends AddContactView implements CodeEntryListener {
 
 		TextView connected = new TextView(ctx);
 		connected.setTextSize(22);
-		connected.setPadding(10, 10, 10, 10);
+		connected.setPadding(pad, pad, pad, pad);
 		connected.setText(R.string.connected_to_contact);
 		innerLayout.addView(connected);
 		addView(innerLayout);
@@ -36,14 +38,14 @@ class ConfirmationCodeView extends AddContactView implements CodeEntryListener {
 		TextView yourCode = new TextView(ctx);
 		yourCode.setGravity(CENTER_HORIZONTAL);
 		yourCode.setTextSize(14);
-		yourCode.setPadding(10, 10, 10, 10);
+		yourCode.setPadding(pad, pad, pad, pad);
 		yourCode.setText(R.string.your_confirmation_code);
 		addView(yourCode);
 
 		TextView code = new TextView(ctx);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		code.setPadding(10, 0, 10, 10);
+		code.setPadding(pad, 0, pad, pad);
 		int localCode = container.getLocalConfirmationCode();
 		code.setText(String.format("%06d", localCode));
 		addView(code);
diff --git a/briar-android/src/org/briarproject/android/invitation/ConnectedView.java b/briar-android/src/org/briarproject/android/invitation/ConnectedView.java
index c31452002b..d91b7ca410 100644
--- a/briar-android/src/org/briarproject/android/invitation/ConnectedView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ConnectedView.java
@@ -27,7 +27,7 @@ class ConnectedView extends AddContactView {
 
 		TextView connected = new TextView(ctx);
 		connected.setTextSize(22);
-		connected.setPadding(10, 10, 10, 10);
+		connected.setPadding(pad, pad, pad, pad);
 		connected.setText(R.string.connected_to_contact);
 		innerLayout.addView(connected);
 		addView(innerLayout);
@@ -38,7 +38,7 @@ class ConnectedView extends AddContactView {
 
 		ProgressBar progress = new ProgressBar(ctx);
 		progress.setIndeterminate(true);
-		progress.setPadding(10, 10, 10, 10);
+		progress.setPadding(pad, pad, pad, pad);
 		innerLayout.addView(progress);
 
 		TextView connecting = new TextView(ctx);
diff --git a/briar-android/src/org/briarproject/android/invitation/ConnectionFailedView.java b/briar-android/src/org/briarproject/android/invitation/ConnectionFailedView.java
index dc3efb8e2f..768ca91bf7 100644
--- a/briar-android/src/org/briarproject/android/invitation/ConnectionFailedView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ConnectionFailedView.java
@@ -2,7 +2,9 @@ package org.briarproject.android.invitation;
 
 import static android.view.Gravity.CENTER;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP;
+
 import org.briarproject.R;
+
 import android.content.Context;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -34,14 +36,14 @@ class ConnectionFailedView extends AddContactView implements OnClickListener {
 
 		TextView failed = new TextView(ctx);
 		failed.setTextSize(22);
-		failed.setPadding(10, 10, 10, 10);
+		failed.setPadding(pad, pad, pad, pad);
 		failed.setText(R.string.connection_failed);
 		innerLayout.addView(failed);
 		addView(innerLayout);
 
 		TextView checkNetwork = new TextView(ctx);
 		checkNetwork.setTextSize(14);
-		checkNetwork.setPadding(10, 0, 10, 10);
+		checkNetwork.setPadding(pad, 0, pad, pad);
 		checkNetwork.setText(R.string.check_same_network);
 		addView(checkNetwork);
 
diff --git a/briar-android/src/org/briarproject/android/invitation/ConnectionView.java b/briar-android/src/org/briarproject/android/invitation/ConnectionView.java
index 7dae72eef4..0762f200b1 100644
--- a/briar-android/src/org/briarproject/android/invitation/ConnectionView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ConnectionView.java
@@ -2,7 +2,9 @@ package org.briarproject.android.invitation;
 
 import static android.view.Gravity.CENTER;
 import static android.view.Gravity.CENTER_HORIZONTAL;
+
 import org.briarproject.R;
+
 import android.content.Context;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
@@ -20,14 +22,14 @@ class ConnectionView extends AddContactView {
 		TextView yourCode = new TextView(ctx);
 		yourCode.setGravity(CENTER_HORIZONTAL);
 		yourCode.setTextSize(14);
-		yourCode.setPadding(10, 10, 10, 10);
+		yourCode.setPadding(pad, pad, pad, pad);
 		yourCode.setText(R.string.your_invitation_code);
 		addView(yourCode);
 
 		TextView code = new TextView(ctx);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		code.setPadding(10, 0, 10, 10);
+		code.setPadding(pad, 0, pad, pad);
 		int localCode = container.getLocalInvitationCode();
 		code.setText(String.format("%06d", localCode));
 		addView(code);
@@ -40,7 +42,7 @@ class ConnectionView extends AddContactView {
 
 			ProgressBar progress = new ProgressBar(ctx);
 			progress.setIndeterminate(true);
-			progress.setPadding(10, 10, 10, 10);
+			progress.setPadding(pad, pad, pad, pad);
 			innerLayout.addView(progress);
 
 			TextView connecting = new TextView(ctx);
@@ -58,7 +60,7 @@ class ConnectionView extends AddContactView {
 			innerLayout.setGravity(CENTER);
 
 			ProgressBar progress = new ProgressBar(ctx);
-			progress.setPadding(10, 10, 10, 10);
+			progress.setPadding(pad, pad, pad, pad);
 			progress.setIndeterminate(true);
 			innerLayout.addView(progress);
 
diff --git a/briar-android/src/org/briarproject/android/invitation/ContactDetailsView.java b/briar-android/src/org/briarproject/android/invitation/ContactDetailsView.java
index f961669760..0a0da9a402 100644
--- a/briar-android/src/org/briarproject/android/invitation/ContactDetailsView.java
+++ b/briar-android/src/org/briarproject/android/invitation/ContactDetailsView.java
@@ -28,7 +28,7 @@ class ContactDetailsView extends AddContactView {
 
 		TextView connected = new TextView(ctx);
 		connected.setTextSize(22);
-		connected.setPadding(10, 10, 10, 10);
+		connected.setPadding(pad, pad, pad, pad);
 		connected.setText(R.string.connected_to_contact);
 		innerLayout.addView(connected);
 		addView(innerLayout);
@@ -36,14 +36,14 @@ class ContactDetailsView extends AddContactView {
 		TextView yourCode = new TextView(ctx);
 		yourCode.setGravity(CENTER_HORIZONTAL);
 		yourCode.setTextSize(14);
-		yourCode.setPadding(10, 0, 10, 10);
+		yourCode.setPadding(pad, 0, pad, pad);
 		yourCode.setText(R.string.your_confirmation_code);
 		addView(yourCode);
 
 		TextView code = new TextView(ctx);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		code.setPadding(10, 0, 10, 10);
+		code.setPadding(pad, 0, pad, pad);
 		int localCode = container.getLocalConfirmationCode();
 		code.setText(String.format("%06d", localCode));
 		addView(code);
@@ -54,7 +54,7 @@ class ContactDetailsView extends AddContactView {
 
 		ProgressBar progress = new ProgressBar(ctx);
 		progress.setIndeterminate(true);
-		progress.setPadding(10, 10, 10, 10);
+		progress.setPadding(pad, pad, pad, pad);
 		innerLayout.addView(progress);
 
 		TextView connecting = new TextView(ctx);
diff --git a/briar-android/src/org/briarproject/android/invitation/InvitationCodeView.java b/briar-android/src/org/briarproject/android/invitation/InvitationCodeView.java
index fba3a0c8c0..795eb529d8 100644
--- a/briar-android/src/org/briarproject/android/invitation/InvitationCodeView.java
+++ b/briar-android/src/org/briarproject/android/invitation/InvitationCodeView.java
@@ -18,14 +18,14 @@ class InvitationCodeView extends AddContactView implements CodeEntryListener {
 		TextView yourCode = new TextView(ctx);
 		yourCode.setGravity(CENTER_HORIZONTAL);
 		yourCode.setTextSize(14);
-		yourCode.setPadding(10, 10, 10, 10);
+		yourCode.setPadding(pad, pad, pad, pad);
 		yourCode.setText(R.string.your_invitation_code);
 		addView(yourCode);
 
 		TextView code = new TextView(ctx);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		code.setPadding(10, 0, 10, 10);
+		code.setPadding(pad, 0, pad, pad);
 		int localCode = container.getLocalInvitationCode();
 		code.setText(String.format("%06d", localCode));
 		addView(code);
diff --git a/briar-android/src/org/briarproject/android/invitation/NetworkSetupView.java b/briar-android/src/org/briarproject/android/invitation/NetworkSetupView.java
index 0e4ecde983..9fc38961bf 100644
--- a/briar-android/src/org/briarproject/android/invitation/NetworkSetupView.java
+++ b/briar-android/src/org/briarproject/android/invitation/NetworkSetupView.java
@@ -44,7 +44,7 @@ implements OnItemSelectedListener, OnClickListener {
 
 		TextView yourNickname = new TextView(ctx);
 		yourNickname.setTextSize(18);
-		yourNickname.setPadding(10, 10, 10, 10);
+		yourNickname.setPadding(pad, pad, pad, pad);
 		yourNickname.setText(R.string.your_nickname);
 		innerLayout.addView(yourNickname);
 
@@ -67,7 +67,7 @@ implements OnItemSelectedListener, OnClickListener {
 		TextView faceToFace = new TextView(ctx);
 		faceToFace.setGravity(CENTER);
 		faceToFace.setTextSize(14);
-		faceToFace.setPadding(10, 10, 10, 10);
+		faceToFace.setPadding(pad, pad, pad, pad);
 		faceToFace.setText(R.string.fact_to_face);
 		addView(faceToFace);
 
diff --git a/briar-android/src/org/briarproject/android/invitation/WaitForContactView.java b/briar-android/src/org/briarproject/android/invitation/WaitForContactView.java
index bcf5cc2334..625c4576cd 100644
--- a/briar-android/src/org/briarproject/android/invitation/WaitForContactView.java
+++ b/briar-android/src/org/briarproject/android/invitation/WaitForContactView.java
@@ -28,7 +28,7 @@ class WaitForContactView extends AddContactView {
 
 		TextView connected = new TextView(ctx);
 		connected.setTextSize(22);
-		connected.setPadding(10, 10, 10, 10);
+		connected.setPadding(pad, pad, pad, pad);
 		connected.setText(R.string.connected_to_contact);
 		innerLayout.addView(connected);
 		addView(innerLayout);
@@ -36,14 +36,14 @@ class WaitForContactView extends AddContactView {
 		TextView yourCode = new TextView(ctx);
 		yourCode.setGravity(CENTER_HORIZONTAL);
 		yourCode.setTextSize(14);
-		yourCode.setPadding(10, 0, 10, 10);
+		yourCode.setPadding(pad, 0, pad, pad);
 		yourCode.setText(R.string.your_confirmation_code);
 		addView(yourCode);
 
 		TextView code = new TextView(ctx);
 		code.setGravity(CENTER_HORIZONTAL);
 		code.setTextSize(50);
-		code.setPadding(10, 0, 10, 10);
+		code.setPadding(pad, 0, pad, pad);
 		int localCode = container.getLocalConfirmationCode();
 		code.setText(String.format("%06d", localCode));
 		addView(code);
@@ -54,7 +54,7 @@ class WaitForContactView extends AddContactView {
 
 		ProgressBar progress = new ProgressBar(ctx);
 		progress.setIndeterminate(true);
-		progress.setPadding(10, 10, 10, 10);
+		progress.setPadding(pad, pad, pad, pad);
 		innerLayout.addView(progress);
 
 		TextView connecting = new TextView(ctx);
diff --git a/briar-android/src/org/briarproject/android/invitation/WifiStatusView.java b/briar-android/src/org/briarproject/android/invitation/WifiStatusView.java
index 3d5b286afd..c55f48fa0b 100644
--- a/briar-android/src/org/briarproject/android/invitation/WifiStatusView.java
+++ b/briar-android/src/org/briarproject/android/invitation/WifiStatusView.java
@@ -4,7 +4,10 @@ import static android.content.Context.WIFI_SERVICE;
 import static android.provider.Settings.ACTION_WIFI_SETTINGS;
 import static android.view.Gravity.CENTER;
 import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1;
+
 import org.briarproject.R;
+import org.briarproject.android.util.LayoutUtils;
+
 import android.content.Context;
 import android.content.Intent;
 import android.net.wifi.WifiInfo;
@@ -18,8 +21,11 @@ import android.widget.TextView;
 
 class WifiStatusView extends LinearLayout implements OnClickListener {
 
+	private final int pad;
+
 	public WifiStatusView(Context ctx) {
 		super(ctx);
+		pad = LayoutUtils.getPadding(ctx);
 	}
 
 	void init() {
@@ -33,12 +39,12 @@ class WifiStatusView extends LinearLayout implements OnClickListener {
 		Context ctx = getContext();
 		TextView status = new TextView(ctx);
 		status.setTextSize(14);
-		status.setPadding(10, 10, 10, 10);
+		status.setPadding(pad, pad, pad, pad);
 		status.setLayoutParams(WRAP_WRAP_1);
 		WifiManager wifi = (WifiManager) ctx.getSystemService(WIFI_SERVICE);
 		if(wifi == null) {
 			ImageView warning = new ImageView(ctx);
-			warning.setPadding(5, 5, 5, 5);
+			warning.setPadding(pad, pad, pad, pad);
 			warning.setImageResource(R.drawable.alerts_and_states_warning);
 			addView(warning);
 			status.setText(R.string.wifi_not_available);
@@ -49,7 +55,7 @@ class WifiStatusView extends LinearLayout implements OnClickListener {
 			int networkId = info.getNetworkId();
 			if(networkName == null || networkId == -1) {
 				ImageView warning = new ImageView(ctx);
-				warning.setPadding(5, 5, 5, 5);
+				warning.setPadding(pad, pad, pad, pad);
 				warning.setImageResource(R.drawable.alerts_and_states_warning);
 				addView(warning);
 				status.setText(R.string.wifi_disconnected);
@@ -60,7 +66,7 @@ class WifiStatusView extends LinearLayout implements OnClickListener {
 				addView(settings);
 			} else {
 				ImageView ok = new ImageView(ctx);
-				ok.setPadding(5, 5, 5, 5);
+				ok.setPadding(pad, pad, pad, pad);
 				ok.setImageResource(R.drawable.navigation_accept);
 				addView(ok);
 				String format = getResources().getString(
@@ -74,7 +80,7 @@ class WifiStatusView extends LinearLayout implements OnClickListener {
 			}
 		} else {
 			ImageView warning = new ImageView(ctx);
-			warning.setPadding(5, 5, 5, 5);
+			warning.setPadding(pad, pad, pad, pad);
 			warning.setImageResource(R.drawable.alerts_and_states_warning);
 			addView(warning);
 			status.setText(R.string.wifi_disabled);
diff --git a/briar-android/src/org/briarproject/android/util/HorizontalSpace.java b/briar-android/src/org/briarproject/android/util/ElasticHorizontalSpace.java
similarity index 74%
rename from briar-android/src/org/briarproject/android/util/HorizontalSpace.java
rename to briar-android/src/org/briarproject/android/util/ElasticHorizontalSpace.java
index b04db1898f..2a4ec2fa97 100644
--- a/briar-android/src/org/briarproject/android/util/HorizontalSpace.java
+++ b/briar-android/src/org/briarproject/android/util/ElasticHorizontalSpace.java
@@ -5,9 +5,9 @@ import android.content.Context;
 import android.view.View;
 import android.widget.LinearLayout.LayoutParams;
 
-public class HorizontalSpace extends View {
+public class ElasticHorizontalSpace extends View {
 
-	public HorizontalSpace(Context ctx) {
+	public ElasticHorizontalSpace(Context ctx) {
 		super(ctx);
 		setLayoutParams(new LayoutParams(WRAP_CONTENT, 0, 1));
 	}
diff --git a/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java b/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java
new file mode 100644
index 0000000000..7a3bb9ee7c
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java
@@ -0,0 +1,15 @@
+package org.briarproject.android.util;
+
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import android.content.Context;
+import android.view.View;
+import android.widget.LinearLayout.LayoutParams;
+
+public class FixedVerticalSpace extends View {
+
+	public FixedVerticalSpace(Context ctx) {
+		super(ctx);
+		int pad = LayoutUtils.getPadding(ctx);
+		setLayoutParams(new LayoutParams(WRAP_CONTENT, pad));
+	}
+}
diff --git a/briar-android/src/org/briarproject/android/util/HorizontalBorder.java b/briar-android/src/org/briarproject/android/util/HorizontalBorder.java
index 2ed3fddf10..6911e371e0 100644
--- a/briar-android/src/org/briarproject/android/util/HorizontalBorder.java
+++ b/briar-android/src/org/briarproject/android/util/HorizontalBorder.java
@@ -1,9 +1,10 @@
 package org.briarproject.android.util;
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+
 import org.briarproject.R;
+
 import android.content.Context;
-import android.content.res.Resources;
 import android.view.View;
 import android.widget.LinearLayout.LayoutParams;
 
@@ -11,8 +12,7 @@ public class HorizontalBorder extends View {
 
 	public HorizontalBorder(Context ctx) {
 		super(ctx);
-		Resources res = ctx.getResources();
-		int width = res.getInteger(R.integer.horizontal_border_width);
+		int width = LayoutUtils.getSeparatorWidth(ctx);
 		setLayoutParams(new LayoutParams(MATCH_PARENT, width));
 		setBackgroundColor(getResources().getColor(R.color.horizontal_border));
 	}
diff --git a/briar-android/src/org/briarproject/android/util/LayoutUtils.java b/briar-android/src/org/briarproject/android/util/LayoutUtils.java
new file mode 100644
index 0000000000..6a14c9807e
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/util/LayoutUtils.java
@@ -0,0 +1,24 @@
+package org.briarproject.android.util;
+
+import static android.content.Context.WINDOW_SERVICE;
+import android.content.Context;
+import android.util.DisplayMetrics;
+import android.view.WindowManager;
+
+public class LayoutUtils {
+
+	public static int getSeparatorWidth(Context ctx) {
+		return Math.max(2, getMaxDisplayDimension(ctx) / 100 - 6);
+	}
+
+	public static int getPadding(Context ctx) {
+		return getMaxDisplayDimension(ctx) / 100 + 7;
+	}
+
+	private static int getMaxDisplayDimension(Context ctx) {
+		DisplayMetrics metrics = new DisplayMetrics();
+		WindowManager wm = (WindowManager) ctx.getSystemService(WINDOW_SERVICE);
+		wm.getDefaultDisplay().getMetrics(metrics);
+		return Math.max(metrics.widthPixels, metrics.heightPixels);
+	}
+}
-- 
GitLab