From fb0b4bb4453568b10a830ff14f751318cbcd85d7 Mon Sep 17 00:00:00 2001
From: Daniel Gultsch <daniel@gultsch.de>
Date: Mon, 24 Aug 2015 20:56:25 +0200
Subject: [PATCH] added setting to allow for white backgrounds in incoming
 message bubbles

---
 art/message_bubble_received_white.svg         | 165 ++++++++++++++++++
 art/render.rb                                 |   1 +
 .../ui/ConversationActivity.java              |  11 +-
 .../ui/ConversationFragment.java              |   1 +
 .../ui/adapter/MessageAdapter.java            |  85 +++++----
 .../message_bubble_received.9.png             | Bin 765 -> 765 bytes
 .../message_bubble_received_warning.9.png     | Bin 757 -> 757 bytes
 .../message_bubble_received_white.9.png       | Bin 0 -> 779 bytes
 .../drawable-hdpi/message_bubble_sent.9.png   | Bin 687 -> 687 bytes
 .../message_bubble_received.9.png             | Bin 594 -> 594 bytes
 .../message_bubble_received_warning.9.png     | Bin 598 -> 598 bytes
 .../message_bubble_received_white.9.png       | Bin 0 -> 610 bytes
 .../drawable-mdpi/message_bubble_sent.9.png   | Bin 558 -> 558 bytes
 .../message_bubble_received.9.png             | Bin 929 -> 929 bytes
 .../message_bubble_received_warning.9.png     | Bin 921 -> 921 bytes
 .../message_bubble_received_white.9.png       | Bin 0 -> 935 bytes
 .../drawable-xhdpi/message_bubble_sent.9.png  | Bin 857 -> 857 bytes
 .../message_bubble_received.9.png             | Bin 1334 -> 1334 bytes
 .../message_bubble_received_warning.9.png     | Bin 1308 -> 1308 bytes
 .../message_bubble_received_white.9.png       | Bin 0 -> 1344 bytes
 .../drawable-xxhdpi/message_bubble_sent.9.png | Bin 1190 -> 1190 bytes
 .../message_bubble_received.9.png             | Bin 1714 -> 1714 bytes
 .../message_bubble_received_warning.9.png     | Bin 1674 -> 1674 bytes
 .../message_bubble_received_white.9.png       | Bin 0 -> 1705 bytes
 .../message_bubble_sent.9.png                 | Bin 1499 -> 1499 bytes
 src/main/res/values/strings.xml               |   2 +
 src/main/res/xml/preferences.xml              |   5 +
 27 files changed, 234 insertions(+), 36 deletions(-)
 create mode 100644 art/message_bubble_received_white.svg
 create mode 100644 src/main/res/drawable-hdpi/message_bubble_received_white.9.png
 create mode 100644 src/main/res/drawable-mdpi/message_bubble_received_white.9.png
 create mode 100644 src/main/res/drawable-xhdpi/message_bubble_received_white.9.png
 create mode 100644 src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png
 create mode 100644 src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png

diff --git a/art/message_bubble_received_white.svg b/art/message_bubble_received_white.svg
new file mode 100644
index 0000000000..52e599f057
--- /dev/null
+++ b/art/message_bubble_received_white.svg
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="36"
+   height="26"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="message_bubble_received.svg">
+  <defs
+     id="defs4">
+    <filter
+       x="-0.25"
+       y="-0.25"
+       width="1.5"
+       height="1.5"
+       inkscape:label="Drop Shadow"
+       id="filter3811"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         flood-opacity="0.25"
+         flood-color="rgb(0,0,0)"
+         result="flood"
+         id="feFlood3813" />
+      <feComposite
+         in="flood"
+         in2="SourceGraphic"
+         operator="in"
+         result="composite1"
+         id="feComposite3815" />
+      <feGaussianBlur
+         stdDeviation="0.5"
+         result="blur"
+         id="feGaussianBlur3817" />
+      <feOffset
+         dx="0"
+         dy="1"
+         result="offset"
+         id="feOffset3819" />
+      <feComposite
+         in="SourceGraphic"
+         in2="offset"
+         operator="over"
+         result="composite2"
+         id="feComposite3821" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="25.745257"
+     inkscape:cy="9.618802"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="989"
+     inkscape:window-height="755"
+     inkscape:window-x="22"
+     inkscape:window-y="16"
+     inkscape:window-maximized="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     guidecolor="#000000"
+     guideopacity="0.49803922">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="4"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       spacingx="1px"
+       spacingy="1px"
+       originx="0px"
+       originy="0px"
+       color="#0000ff"
+       opacity="0.03137255" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="20,26"
+       id="guide3060" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="24,26"
+       id="guide3062" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="36,22"
+       id="guide3064" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="36,6"
+       id="guide3066" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="26,0"
+       id="guide3068" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="18,0"
+       id="guide3070" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="0,10"
+       id="guide3074" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="0,8"
+       id="guide3076" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer"
+     inkscape:groupmode="layer"
+     id="layer"
+     transform="translate(0,-2)">
+    <g
+       id="g3759"
+       style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
+      <path
+         style="display:none"
+         d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
+         id="path3805"
+         inkscape:connector-curvature="0"
+         transform="translate(0,2)"
+         sodipodi:nodetypes="cccc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2989"
+         d="M 4,4 16,16 16,4 z"
+         sodipodi:nodetypes="cccc" />
+      <rect
+         ry="2"
+         y="4"
+         x="12"
+         height="20"
+         width="20"
+         id="rect2987" />
+    </g>
+  </g>
+</svg>
diff --git a/art/render.rb b/art/render.rb
index dc55c3276c..b4f84769c6 100755
--- a/art/render.rb
+++ b/art/render.rb
@@ -45,6 +45,7 @@ images = {
 	'md_switch_thumb_on_pressed.svg' => ['switch_thumb_on_pressed', 48],
 	'message_bubble_received.svg' => ['message_bubble_received.9', 0],
 	'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0],
+	'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0],
 	'message_bubble_sent.svg' => ['message_bubble_sent.9', 0],
 	}
 
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
index 219a4fcac2..e7f453994b 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
@@ -966,6 +966,9 @@ public class ConversationActivity extends XmppActivity
 			mPendingGeoUri = null;
 			setSelectedConversation(conversationList.get(0));
 			this.mConversationFragment.reInit(getSelectedConversation());
+		} else {
+			this.mConversationFragment.messageListAdapter.updatePreferences();
+			this.mConversationFragment.messagesView.invalidateViews();
 		}
 
 		if(!forbidProcessingPendings) {
@@ -1144,7 +1147,7 @@ public class ConversationActivity extends XmppActivity
 		}
 		prepareFileToast = Toast.makeText(getApplicationContext(),getText(R.string.preparing_file), Toast.LENGTH_LONG);
 		prepareFileToast.show();
-		xmppConnectionService.attachFileToConversation(conversation,uri, new UiCallback<Message>() {
+		xmppConnectionService.attachFileToConversation(conversation, uri, new UiCallback<Message>() {
 			@Override
 			public void success(Message message) {
 				hidePrepareFileToast();
@@ -1174,7 +1177,7 @@ public class ConversationActivity extends XmppActivity
 
 					@Override
 					public void userInputRequried(PendingIntent pi,
-							Message object) {
+												  Message object) {
 						hidePrepareFileToast();
 					}
 
@@ -1256,6 +1259,10 @@ public class ConversationActivity extends XmppActivity
 		return getPreferences().getBoolean("indicate_received", false);
 	}
 
+	public boolean useWhiteBackground() {
+		return getPreferences().getBoolean("use_white_background",false);
+	}
+
 	protected boolean trustKeysIfNeeded(int requestCode) {
 		return trustKeysIfNeeded(requestCode, ATTACHMENT_CHOICE_INVALID);
 	}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index de758efc12..541e1533b6 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -662,6 +662,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 		this.mEditMessage.setText("");
 		this.mEditMessage.append(this.conversation.getNextMessage());
 		this.mEditMessage.setKeyboardListener(this);
+		messageListAdapter.updatePreferences();
 		this.messagesView.setAdapter(messageListAdapter);
 		updateMessages();
 		this.messagesLoaded = true;
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
index 1ddd6c44a2..8cdcb585f2 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
@@ -60,11 +60,14 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			return true;
 		}
 	};
+	private boolean mIndicateReceived = false;
+	private boolean mUseWhiteBackground = false;
 
 	public MessageAdapter(ConversationActivity activity, List<Message> messages) {
 		super(activity, 0, messages);
 		this.activity = activity;
 		metrics = getContext().getResources().getDisplayMetrics();
+		updatePreferences();
 	}
 
 	public void setOnContactPictureClicked(OnContactPictureClicked listener) {
@@ -96,15 +99,15 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		return this.getItemViewType(getItem(position));
 	}
 
-	private int getMessageTextColor(int type, boolean primary) {
-		if (type == SENT) {
-			return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54);
-		} else {
+	private int getMessageTextColor(boolean onDark, boolean primary) {
+		if (onDark) {
 			return activity.getResources().getColor(primary ? R.color.white : R.color.white70);
+		} else {
+			return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54);
 		}
 	}
 
-	private void displayStatus(ViewHolder viewHolder, Message message, int type) {
+	private void displayStatus(ViewHolder viewHolder, Message message, int type, boolean darkBackground) {
 		String filesize = null;
 		String info = null;
 		boolean error = false;
@@ -140,12 +143,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				info = getContext().getString(R.string.offering);
 				break;
 			case Message.STATUS_SEND_RECEIVED:
-				if (activity.indicateReceived()) {
+				if (mIndicateReceived) {
 					viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
 				}
 				break;
 			case Message.STATUS_SEND_DISPLAYED:
-				if (activity.indicateReceived()) {
+				if (mIndicateReceived) {
 					viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
 				}
 				break;
@@ -162,11 +165,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		if (error && type == SENT) {
 			viewHolder.time.setTextColor(activity.getWarningTextColor());
 		} else {
-			viewHolder.time.setTextColor(this.getMessageTextColor(type,false));
+			viewHolder.time.setTextColor(this.getMessageTextColor(darkBackground,false));
 		}
 		if (message.getEncryption() == Message.ENCRYPTION_NONE) {
 			viewHolder.indicator.setVisibility(View.GONE);
 		} else {
+			viewHolder.indicator.setImageResource(darkBackground ? R.drawable.ic_secure_indicator_white : R.drawable.ic_secure_indicator);
 			viewHolder.indicator.setVisibility(View.VISIBLE);
 			if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL) {
 				XmppAxolotlSession.Trust trust = message.getConversation()
@@ -178,18 +182,18 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 					viewHolder.indicator.setAlpha(1.0f);
 				} else {
 					viewHolder.indicator.clearColorFilter();
-					if (type == SENT) {
-						viewHolder.indicator.setAlpha(0.57f);
-					} else {
+					if (darkBackground) {
 						viewHolder.indicator.setAlpha(0.7f);
+					} else {
+						viewHolder.indicator.setAlpha(0.57f);
 					}
 				}
 			} else {
 				viewHolder.indicator.clearColorFilter();
-				if (type == SENT) {
-					viewHolder.indicator.setAlpha(0.57f);
-				} else {
+				if (darkBackground) {
 					viewHolder.indicator.setAlpha(0.7f);
+				} else {
+					viewHolder.indicator.setAlpha(0.57f);
 				}
 			}
 		}
@@ -223,19 +227,19 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		}
 	}
 
-	private void displayInfoMessage(ViewHolder viewHolder, String text, int type) {
+	private void displayInfoMessage(ViewHolder viewHolder, String text, boolean darkBackground) {
 		if (viewHolder.download_button != null) {
 			viewHolder.download_button.setVisibility(View.GONE);
 		}
 		viewHolder.image.setVisibility(View.GONE);
 		viewHolder.messageBody.setVisibility(View.VISIBLE);
 		viewHolder.messageBody.setText(text);
-		viewHolder.messageBody.setTextColor(getMessageTextColor(type,false));
+		viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
 		viewHolder.messageBody.setTypeface(null, Typeface.ITALIC);
 		viewHolder.messageBody.setTextIsSelectable(false);
 	}
 
-	private void displayDecryptionFailed(ViewHolder viewHolder, int type) {
+	private void displayDecryptionFailed(ViewHolder viewHolder, boolean darkBackground) {
 		if (viewHolder.download_button != null) {
 			viewHolder.download_button.setVisibility(View.GONE);
 		}
@@ -243,7 +247,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		viewHolder.messageBody.setVisibility(View.VISIBLE);
 		viewHolder.messageBody.setText(getContext().getString(
 				R.string.decryption_failed));
-		viewHolder.messageBody.setTextColor(getMessageTextColor(type,false));
+		viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
 		viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
 		viewHolder.messageBody.setTextIsSelectable(false);
 	}
@@ -261,7 +265,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		viewHolder.messageBody.setText(span);
 	}
 
-	private void displayTextMessage(final ViewHolder viewHolder, final Message message, int type) {
+	private void displayTextMessage(final ViewHolder viewHolder, final Message message, boolean darkBackground) {
 		if (viewHolder.download_button != null) {
 			viewHolder.download_button.setVisibility(View.GONE);
 		}
@@ -303,7 +307,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				}
 				final Spannable span = new SpannableString(privateMarker + " "
 						+ formattedBody);
-				span.setSpan(new ForegroundColorSpan(getMessageTextColor(type,false)), 0, privateMarker
+				span.setSpan(new ForegroundColorSpan(getMessageTextColor(darkBackground,false)), 0, privateMarker
 						.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 				span.setSpan(new StyleSpan(Typeface.BOLD), 0,
 						privateMarker.length(),
@@ -318,7 +322,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		} else {
 			viewHolder.messageBody.setText("");
 		}
-		viewHolder.messageBody.setTextColor(this.getMessageTextColor(type,true));
+		viewHolder.messageBody.setTextColor(this.getMessageTextColor(darkBackground, true));
+		viewHolder.messageBody.setLinkTextColor(this.getMessageTextColor(darkBackground,true));
 		viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
 		viewHolder.messageBody.setTextIsSelectable(true);
 	}
@@ -388,7 +393,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			scalledH = (int) (params.height / ((double) params.width / target));
 		}
 		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(scalledW, scalledH);
-		layoutParams.setMargins(0, (int)(metrics.density * 4), 0, (int)(metrics.density * 4));
+		layoutParams.setMargins(0, (int) (metrics.density * 4), 0, (int) (metrics.density * 4));
 		viewHolder.image.setLayoutParams(layoutParams);
 		activity.loadBitmap(message, viewHolder.image);
 		viewHolder.image.setOnClickListener(new OnClickListener() {
@@ -404,6 +409,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 	@Override
 	public View getView(int position, View view, ViewGroup parent) {
 		final Message message = getItem(position);
+		final boolean isInValidSession = message.isValidInSession();
 		final Conversation conversation = message.getConversation();
 		final Account account = conversation.getAccount();
 		final int type = getItemViewType(position);
@@ -468,6 +474,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			}
 		}
 
+		boolean darkBackground = (type == RECEIVED && (!isInValidSession || !mUseWhiteBackground));
+
 		if (type == STATUS) {
 			if (conversation.getMode() == Conversation.MODE_SINGLE) {
 				viewHolder.contact_picture.setImageBitmap(activity
@@ -497,7 +505,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				public void onClick(View v) {
 					if (MessageAdapter.this.mOnContactPictureClickedListener != null) {
 						MessageAdapter.this.mOnContactPictureClickedListener
-							.onContactPictureClicked(message);
+								.onContactPictureClicked(message);
 					}
 
 				}
@@ -509,7 +517,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				public boolean onLongClick(View v) {
 					if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) {
 						MessageAdapter.this.mOnContactPictureLongClickedListener
-							.onContactPictureLongClicked(message);
+								.onContactPictureLongClicked(message);
 						return true;
 					} else {
 						return false;
@@ -524,7 +532,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			} else if (transferable.getStatus() == Transferable.STATUS_OFFER_CHECK_FILESIZE) {
 				displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
 			} else {
-				displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,type);
+				displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,darkBackground);
 			}
 		} else if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) {
 			displayImageMessage(viewHolder, message);
@@ -536,9 +544,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			}
 		} else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
 			if (activity.hasPgp()) {
-				displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),type);
+				displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),darkBackground);
 			} else {
-				displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),type);
+				displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),darkBackground);
 				if (viewHolder != null) {
 					viewHolder.message_box
 						.setOnClickListener(new OnClickListener() {
@@ -551,7 +559,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				}
 			}
 		} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
-			displayDecryptionFailed(viewHolder,type);
+			displayDecryptionFailed(viewHolder,darkBackground);
 		} else {
 			if (GeoHelper.isGeoUri(message.getBody())) {
 				displayLocationMessage(viewHolder,message);
@@ -560,19 +568,23 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 			} else if (message.treatAsDownloadable() == Message.Decision.MUST) {
 				displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
 			} else {
-				displayTextMessage(viewHolder, message, type);
+				displayTextMessage(viewHolder, message, darkBackground);
 			}
 		}
 
 		if (type == RECEIVED) {
-			if(message.isValidInSession()) {
-				viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received);
+			if(isInValidSession) {
+				if (mUseWhiteBackground) {
+					viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_white);
+				} else {
+					viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received);
+				}
 			} else {
 				viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning);
 			}
 		}
 
-		displayStatus(viewHolder, message, type);
+		displayStatus(viewHolder, message, type, darkBackground);
 
 		return view;
 	}
@@ -616,12 +628,17 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		Toast.makeText(activity,R.string.no_application_found_to_display_location,Toast.LENGTH_SHORT).show();
 	}
 
+	public void updatePreferences() {
+		this.mIndicateReceived = activity.indicateReceived();
+		this.mUseWhiteBackground = activity.useWhiteBackground();
+	}
+
 	public interface OnContactPictureClicked {
-		public void onContactPictureClicked(Message message);
+		void onContactPictureClicked(Message message);
 	}
 
 	public interface OnContactPictureLongClicked {
-		public void onContactPictureLongClicked(Message message);
+		void onContactPictureLongClicked(Message message);
 	}
 
 	private static class ViewHolder {
diff --git a/src/main/res/drawable-hdpi/message_bubble_received.9.png b/src/main/res/drawable-hdpi/message_bubble_received.9.png
index 1a496771eb909f3ffdd4937afda2c3baf9d686a7..4445ca04a5d7e1652df516620a88c31945091475 100644
GIT binary patch
delta 76
zcmey%`j>S=A18-|kd9T>zppPhPJhcNZlP;r5@Kj!WnyAwYN2glWMyD5J%wT6<k?J8
P*yNsB?vR~)hRF~B*$EfQ

delta 76
zcmey%`j>S=A1Avkqm|mp&a~Ydr@v(sH`g_?3^6dYGPSTWw$L^(vNABZ^^G%e@@yt4
PY;vntZ@fGC43i-MynGmN

diff --git a/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png
index 9cd2f825d20537f5df39483f7257c9644f471f27..1bd8cb51f7e1e7e133c81bb414dccaaf91f009d6 100644
GIT binary patch
delta 97
zcmey$`jvG;A18-|kS@d4m$FhDr$1%%u+TL!2{E*=GBLF>FwizI0+P%twdXJ}FsPQe
jMwFx^mZVzc=BH$)RWcYE7@F!DV9`+YWwOHLBTR+>cvKtX

delta 97
zcmey$`jvG;A1Avkqm}x;zA)X5)1NYWnClu@h8P%HnOayGTWT8^Ss57AG%{UfU|>)!
kag8WRNi0dV%FR#7OsixtGB7mNHNc{Q_s*`&$w!zB0h+lSZ~y=R

diff --git a/src/main/res/drawable-hdpi/message_bubble_received_white.9.png b/src/main/res/drawable-hdpi/message_bubble_received_white.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..15d27cca8ddded4231cd8c2363772995c2cc45a2
GIT binary patch
literal 779
zcmeAS@N?(olHy`uVBq!ia0vp^7C@}Y!3HD~cwQ+0DVB6cUq=Rpjs4tz5?O(Kg=CK)
zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G(@^*It(m?Rjd3QaK
z;w<opEM{O3ISj&#q6NNAKtc8rPhVH|`y3KNx{Qb3>Gm)%Fkba^aSX}0_x7f}{~-s7
z;~(>@TUnB&gcnbovEd_|1c$bMqxpl?1qB5m?C$^l^49t7W4Ond=)fMPpvZPnV)Cod
zXm$lRr`1=cZQi<nW9GW^%g=9p`PJmgv9A{EG}meS&T>7Pzb<=P>RS#)z7TOs?Y_rf
zWRLHB^R;UC(WH-8U)$VG=dqoBTK4<zzqMCq%sl$?S6iaQ?VmMu{PW#j-tP_85YdZT
zdu?LYgzy%D=mtTS7YzCbidTkM<(ti3zRFPUK&isvH+sA39K<&?sz2Blqc`77s@M3c
zLO;u^2P~S$PdF|Ovi!OD#DVh(b0#!4Zgl%6A`$(>=0JqfbJk;gk}MM1Px7zFN=;z(
zN$~ZmT+B4_Y+AU)-8V14F3mn;f9E>mk2fi9tnYTS%w2TZLwZ9<@**a`34K{UQx4eA
z7LoYA<iHO1<G-J0D}B<pn(^X=N{#%3_!5JQoT3^_WptzxZhw=tyIqjTbT@B%_1=tx
z<(GGUV^nh5)yLLRwYM&MZJ6(66Z2L9@4!P#rZkuBt_@v%m9PEqL*@_9LL(whGH4&r
z+HmH@GuN+eWsT(zBzLgONv`!&X7#I!*J0kt%DC1r=#ioCVLb=w!;6miD&P0~@jPvo
zi~G^?7kkd1UZ3@c;fDP3J+eWupfsae;u=wsl30>zm0Xkxq!^403{7<nEOd=bLJTde
zOiZl|47Cl6tPBj6-c!&((U6;;l9^VCTf>#+8B>57BtbR==ckpFCl;kLl$V$5W#(lU
cCnpx9>g5-u&wghk1ysb~>FVdQ&MBb@0La8Ks{jB1

literal 0
HcmV?d00001

diff --git a/src/main/res/drawable-hdpi/message_bubble_sent.9.png b/src/main/res/drawable-hdpi/message_bubble_sent.9.png
index 2bb4e04f688d73b1686bc9e743fa5fe1029ac0f5..5d79264e930f3cfdcb32afad9bf0093dc2c6d148 100644
GIT binary patch
delta 76
zcmZ3_x}J4HA18-|kS?>%1D^#Or_W~;x6m~*2{E*=GBLF>FxECOvNA9*ax`R|?8_vD
OP0m@SbMNFjCPM%TT@z>k

delta 76
zcmZ3_x}J4HA1Avkqm_o9q4%DR)8{jao9h}`h8P%HnOazx7-$<9Ss55SzT+o9*_TNQ
Po7|+vZ;L0_F&P2?E9Di7

diff --git a/src/main/res/drawable-mdpi/message_bubble_received.9.png b/src/main/res/drawable-mdpi/message_bubble_received.9.png
index 7e134402f159f79924ea82f72da2546d60b1df99..ba63820b2a841d804c6bea7d8d4cd89a968c149d 100644
GIT binary patch
delta 76
zcmcb_a*1U^A18-|kd9T>zppPhPIqDyx6m~*2{E*=GBL3-wa_*&vNAB3p2Dzj@&`sK
PY;w;mcgRjwWHJN*ps^Nk

delta 76
zcmcb_a*1U^A1Avkqm|mp&a~Ydr#mr<o9h}`h8P%HnOayGTWA{?Ss57I`o@_!`2(XA
PHo4WSH{PAB$Yclrgd`Uh

diff --git a/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png
index 38f75e051ad1c435fa0e2e51ae18ffcd422a87aa..6523e9a14b332d2f558c35febd9e510f217b002a 100644
GIT binary patch
delta 97
zcmcb{a*bs|A18-|kS@d4m$FhDr@JwFSm+v=gcw>_nV4D`7-$<90ZHbS+H)8f7*tDK
jBT7;dOH!?J^HVa@DjAFn3{7<nuxKdyGFf4=Dw81qEod5L

delta 97
zcmcb{a*bs|A1Avkqm}x;zA)X5)7=<7%yo?{LktY9Of9U8Ewv4dtPBil8kw##Ffgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq}DduLbXWK||Z08h;t@&Et;

diff --git a/src/main/res/drawable-mdpi/message_bubble_received_white.9.png b/src/main/res/drawable-mdpi/message_bubble_received_white.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..2abd4fe1b6c00f8533ccf7abf8820852992028c3
GIT binary patch
literal 610
zcmeAS@N?(olHy`uVBq!ia0vp^YCtT*!3Gk!b2b%7v7|ftIx;Y9?C1WI$O_~uBzpw;
zGB8vD6*jamF#G}vHN0S8C^cYUc$L7wU^Rn*LA+qju0R{01Y44~y9<y8f}hU2>wy$!
zfk$L9(Cq6V%;=;sy8<Z4UgGKN%6^|iLP(eK&^z581_nkQPZ!6Kh{JEE?e{w3Ake=5
zjh9cA^xo?p6U{$KuCr%3=(l0RM@^r5O0M$`JYw1Fe0xK;h1hbX#IK+7Co6n^Z6ujy
zSNG;zPJ_JXTk8*3o-fF^)LpkKYvtB`AMVDu$hkhT>00#rm;KWd;e|5yr>0iEy*pJQ
zqT|Hc?!&C#`1YuI7KMr&?ajAX`&F_aguDBf>U}2v%vo`LjO~v-R@zTG-j>Z{rg_J1
z!^sD;8hn|qmxZ<*Sh@9EqDO}TkMe;(9G=0)_oXzReeliViWpB>ao)6q#V;7HvHDbn
ze`GQ9)=c~LX71MHwW(`mb52BM&zF6;fP2Q1%6&%1a(+8WCYwc0TU!uwK<~LXqxu0R
zi+2&t{u0b<8pX4umu3eZeP?;+`y-AI$2_v%)n~tu+?L;M^6ooh%Jbw?oqPJbfI+ER
z;u=wsl30>zm0Xkxq!^403{7<nEOd=bLJTdeOiZl|47Cl6tPBj6-c!&((U6;;l9^VC
zTf>#+8B>57BtbR==ckpFCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ysb~>FVdQ&MBb@
E0QQ#UzW@LL

literal 0
HcmV?d00001

diff --git a/src/main/res/drawable-mdpi/message_bubble_sent.9.png b/src/main/res/drawable-mdpi/message_bubble_sent.9.png
index b42664a85a4fc309e479275ed541ebda24400580..dd23cf7d77b209e34c11dc2928271e97c2f0d9a8 100644
GIT binary patch
delta 76
zcmZ3-vW{g!A18-|kS?>%1D^#Or^_*lTj&~@gcw>_nV4D`7;76CSs54@IT|ufKEo)5
OP0m@SbMNH8jD`UFs1x4+

delta 76
zcmZ3-vW{g!A1Avkqm_o9q4%DR)8!b&&2^0|LktY9Of9TT473f5tPBhu-|>^5e1=g9
Po7|+vZ;L1YWi$i;9zPZW

diff --git a/src/main/res/drawable-xhdpi/message_bubble_received.9.png b/src/main/res/drawable-xhdpi/message_bubble_received.9.png
index dc8ee5346067fd76101d1e36c42e7e99df4b1de2..aa0fc16e429c0ea5db86869c256b7ba6d1794dc2 100644
GIT binary patch
delta 76
zcmZ3;zL0%FA18-|kd9T>zppPhPM^pmZlP;r5@Kj!WnyAwYN2glWMyD5J%wT6WP4^Q
PY;w;mcgRjIU^WB*gOU~n

delta 76
zcmZ3;zL0%FA1Avkqm|mp&a~Ydr%z-OH`g_?3^6dYGPSTWw$L^(vNABZ^^G%evOTjD
PHo4WSH{P9Gz-$NrX9X6k

diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png
index b5be808f84e5ba67c01ec49102f5ec555a4a1ea3..79e6e1fdf2223bdf600f76f7c49af0bd0301254e 100644
GIT binary patch
delta 97
zcmbQqK9hYyA18-|kS@d4m$FhDr*|@WSm+v=gcw>_nV4D`7-$<90ZHbS+H)8f7*tDK
jBT7;dOH!?J^HVa@DjAFn3{7<nuxKdyGFf4A2D2dm7pNL}

delta 97
zcmbQqK9hYyA1Avkqm}x;zA)X5(>s|w%yo?{LktY9Of9U8Ewv4dtPBil8kw##Ffgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq}DduLbX<P2s*06GmD1^@s6

diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..771c3ff4305d578f5993f21c1662c3aea363badd
GIT binary patch
literal 935
zcmeAS@N?(olHy`uVBq!ia0vp^UO;Td!3HD~4ERq2DVB6cUq=Rpjs4tz5?O(Kg=CK)
zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G(@^*It(m?Rjd3QaK
z;w<opEM{PkUJt^IaZ(dyfP(BLp1!W^_c<hlbeW=`*O)OdFco^bIEG~0dpm1?-(>@t
z<Mw{5|2f7~Uy!a~+Z6ul6!!<c6+$^Vtxr|NT3pyFgskRX;1!jfsP(Mptzh5oCBBCy
zxOFv{J$rS;<fHqkfUBXOe*efmy;9eL@6nw1t?$@PBzV~7p73cp^!@L1r;hMl@?nZ`
zGRNoF+^@g*`s=<^e-2E_yqvfFe#N}+LFJ`fmV!<;Z%eG^$6l}PaY^{((wRH^TY|xl
z4G}u$O2b#oxLmj2e&UA-w-wlw6j+jOZ?ix5{PXr*tAjlkU#ws<Iq5m|%!O_S`40^F
z7BW_wZ@!uPjww{J#ey-)QZGp|&~O7|9g}u~sZ{U1a8I!=A=dg+QDHvU4o<F|rgb_<
zi))o`w*G%Dt}LzBdW#mcZF&b}s=XEn3{Z}2?`oQLB1n-dOTl}p#)=(ll>SW-S6R>U
zy&?F4qX0{MiTJMmu+^n(F%wI^-0zspddGaW4x>p)cR=H*h0|51mO3lFd7<egqO!@U
z?D)?W8bKjm_ntis3}{>7mEhu;goXkqmik?s0T)c<>+(tzQtcE3Ay3Uki!^p!i+!PY
z$l#CSMV~23SzDuGv%YPd{IsaD@yMdxJb@D*TRfkA)@|8yuhhM9@xE%4uX}W8Rkgb?
z^u8>q5@tELH1~G@uDkDMrbg<{Z8~JIr!4k+l8u~wvCMPnlN(QewM%qezmVnR&l7eZ
z1a|oUt2`ML!+0?4g3ynBfA<832>z~$yp+4T<i<~jc9oO6#CE-Wcj0Z=6;sR1MN8U!
z&#yA~ymZB-e$k?}a~hT?C;wv(yjh*9KljM~ShnVa1y^3o3n?#r!LoYKy7+}rU)3kb
z{b~iKN7WM7h?11Vl2ohYqEsNoU}Ruus%v1OYh)5)XkleyYGq)gZD3?&U@*nZYAcF{
z-29Zxv`X9>o@O_30yRj2YzWRzD=AMbN@XZ7FW1Y=%Pvk%EJ)SMFG`>N&PEETh{4m<
K&t;ucLK6U8ym>zW

literal 0
HcmV?d00001

diff --git a/src/main/res/drawable-xhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xhdpi/message_bubble_sent.9.png
index f1c4623268b204e80414a8ce39b72774fabf3ee6..9e01ebacaf9d4e9d9598ac41c5d81b7244bf8743 100644
GIT binary patch
delta 97
zcmcb~c9U&FA18-|kS?>%1D^#Or+YGaSm+v=gcw>_nV4D`7;76CSs54@IT|uDFfgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq}jEYrDnvIesu01ed{VE_OC

delta 97
zcmcb~c9U&FA1Avkqm^c)S+&;2>7Gm;=DJ3fAqIw4rWRHvhS~;3Rt5&Ht6f(!Ffgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq|2^6jtqWDRCR03=izn*aa+

diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received.9.png
index 6ce844871f55002e89a5b76a3d6fc4b186ee6cdf..0af666695d65590838d137d56cf7af1ac1bd6724 100644
GIT binary patch
delta 97
zcmdnSwT){+A18-|kdC$N&!hDlr>n7eSm+v=gcw>_nV49aT51~@Ss54@3UiAxFfgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq}j;J10@WL8!~02L1zk^lez

delta 97
zcmdnSwT){+A1Avkqm}x;zA)X5)74l!%yo?{LktY9Of9U8Ewv4dtPBil8kw##Ffgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq}DduLbXWL8!~05b6!ga7~l

diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png
index a318186980a2a4f17fa2ec83fe3b5c5b5724e652..e128d58a66d593baff48e0e80086d98632335503 100644
GIT binary patch
delta 76
zcmbQkHHT|LA18-|kS@d4m$FhDr}MCgTj&~@gcw>_nV4D`7-$<90ZHbS+H)rFVv)io
NSM+7F!sOR1h5!aa6tDmQ

delta 76
zcmbQkHHT|LA1Avkqm_o9q4%DR(|K6L&2^0|LktY9Of9TT473f5tPBhu-|>^5yo*H&
Po7|+vZ;L0tW-$Z+5xy0@

diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..94baefed941a683efdb5b99f1c5ac5be5f2187bd
GIT binary patch
literal 1344
zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%!3HFMXgjC@DVB6cUq=Rpjs4tz5?O(Kg=CK)
zUj~LMpj<->1H&(%P{RubhEf9thF1v;3|2E37{m+a><Y92O0Xq)ySo5sAo%ILyB<h!
z7I;J!GcahjfiR=eoBKULLG}_)Usv|~91=phOwrG4%z&11dAc};RNQ(yccZ^bsKkN#
z{Pw#t+qF9{NpK0Rm~g0x%S+1I+PU!$cX+^xy`3BPOZ4{2U5&hvo9?`pQ-n?Ek*lI%
zW6Oq4#<sn&Hzd0s?wlN)a?ijxf8Xx+)Azg)JM+%`e*XTM`Q^`SdGggZKE5w~pHaJO
zkw({|E3=e#slMH@>G7?z_dMq<nSC(f!%V|x-uEK~JUHIC27dYT<jIrUJ9qA!UKxKP
zbk0uMUIQNcT(jBnKhCv;JhJ$=_4?~t3uEKY>Xup?CqA~7cG!G3um0-muXf+(GOUzH
zzBhl~ymw{0?|K%={ERW%aMg@)OM~Zwiw6%Loc#0WPyZTqC#}N|3pQVVX`{Mw*O{r$
zg9<-t_p{B2h={1zwtf5eE9Fc}E@hb5u`wNMotSHV{QJiFU4jL?cNi{Sx^!vt-Me?!
z*Qz@zISTAyHz_Qc=pN&ul*92Q|9C=W<<H-9=g!RsnlE*1hFNl9q_*C<%X4mYZGLp<
z_Qm+f$e(^spC&OKXH#9j<Nu`c&Qqton+uPo3e9krS+QqPVU~}=ev5!g*GGSB-zh$F
zcv|^*A&6YaQMllf)^ZIHxzqzhF3tdv3weN~*K!>Yxzq<lF3tgw3%P(K*K#coxzr0p
z9=?8d%{L>r13!)}HoL$m$KQT9zD9kSSJc{TyAQA$DC|7^VBhSvN1Xl}Zym^a8aZdZ
z_uiF1gxLR2OZVWrYnLq4{9YxpQm}JR!;^xAcbfAH4fYkEnGkZn_kDv(Kxz2T`iREX
zvl*3hS5CI*?mF!tdsI_0pwKB0H_BYFpSR0J+fPFa3F)oAsbT7bCb(5Z-1Xwr_Yzun
zuAi2fJu|B7_4nWVfA=kX_dCkH@Z-gcf!E6gLJKP@ZX7LC%v~{mheXHq>(}SEC;m88
zZjdV6_Aoy?JKKK3<4aKwtbd4<)x~^%^G3(Q*7k2@X=&-st66&=TW>Jhv13QY#+^HV
zrc_t|7OC(w+MDCz)>-;%=V`yJIV|^>mZhbq-@kY3)~}4h!jH`>SFYTtz@b*l{!_qh
zap3<yfBy9U{rh*mnVDIgjh)>;ZVUC9ZZ)n-dZ#``l?qLtC;V@QOB{Pe%WtiRrAPf#
zcdM=3<bCW?n?*>BteV-fjn<|KH4^d@Pi)a{^`4q8J>kox|KZzzSNR_E+I+<`rpoV!
z!q-2uTw)p?dp$Hg<kc;4zH<BXtzUNP7Eca3&T>OdRpDpC&BUXg$GUcV@>a(cztVZF
zaqigH^ZRYQd##Sw$iHmmded?8qpY8k&>7kOpw9OdC2mnlOOF25s^VV_%7hy0)i3Sd
z@>^qf_vdN*_cJ<~99pP+Z`KcBL7`gW8c~vxSdwa$T$Bo=7>o=IO?3?{bd5|x3@xlo
zOsx!zv<-}`3=F22S#3qpkei>9nO2Eg!_(|0PM`)!kPX54X(i=}MX3zs<>h*rdD+Fu
bi3O>8`9<lo-`Pk36)||a`njxgN@xNAo-<mT

literal 0
HcmV?d00001

diff --git a/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png
index 9f36a6494d311378552cca53a17533db13ac5593..de4f8784b902f89fc5b4d70015ba2864c4546337 100644
GIT binary patch
delta 97
zcmZ3+xr}o{A18-|kS@!nmYd8Qr%z+{u+TL!2{E*=GBLF>Fwr(JvNACE{*1q$fq_A_
l#5JNMC9x#cDmOnRGp&-r$iUE4*8q!#w%yx}CzrAq0swfI92Nio

delta 97
zcmZ3+xr}o{A1Avkqm^c)S+&;2>C>1!%yo?{LktY9Of9TT47Cl6tPBiXSG%reU|>)!
kag8WRNi0dV%FR#7OsixtGB7mNHNc|5<lA5I$)zlY02xRc*8l(j

diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png
index e7fa6754bc6123e8e9f627282588ba12aa4216f7..8a35671d47f584cddbdc65852e005f1e73d7241d 100644
GIT binary patch
delta 76
zcmdnQyNP!~A18-|kdC$N&!hDlr!Qg^x6m~*2{E*=GBL3-wbV8+vNA9*6y_G49Ka@p
OP0qn@^UBGMY=!_cMHEB;

delta 76
zcmdnQyNP!~A1Avkqm}x;zA)X5(-*Odo9h}`h8P%HnOayGTWT8^Ss57AG%{VC9Ka@p
OO^)}@uFT1eY=!_p0u?p@

diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png
index 398e53a2d589246ea034d7e600da45cfe831bf52..2b4e08b2b08eff4fe9b239480514c22d34ea4ad0 100644
GIT binary patch
delta 97
zcmeC;?c$x#$H^ffq|12doo>&@=~b*A7P>|zA%+%KCZ<*fhS~;3Rt5%3?<r_7Ffgc=
kxJHzuB$lLF<>sekrd2W+85o-C8eq|IrFq7b$&qY^091S%r~m)}

delta 97
zcmeC;?c$x#$H^|sXr-ZN=)Gs-^eR>lb6q3L5CcOiQwu8-18oB%D+7bacl_iT7#LJb
kTq8<S5=&C8a`RI%(<&K^3=B<m4X|jK)c9@j<VZF{03s+GTmS$7

diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ea852cec6d4d52476463ed1e8da851e72695315
GIT binary patch
literal 1705
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
YhFMHJvrK$oCn5rFuE$*J4h5zE2@mD&3jhEB

literal 0
HcmV?d00001

diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png
index be428cd2e0bd2dbd858926f98b5d44bfeb3dcde7..5cbfdbb4b6596a0719c36015ac412b9b03174a8e 100644
GIT binary patch
delta 97
zcmcc3eVcniA18-|kS@!nmYd8Qr=Mo=u+TL!2{E*=GBLF>Fwr(JvNACE{*1q$fq_A_
l#5JNMC9x#cDmOnRGp&-r$iUE4*8q!#w%yx}C$C~P1OT%g9Pj`D

delta 97
zcmcc3eVcniA1Avkqm^c)S+&;2>8Dvd%yo?{LktY9Of9TT47Cl6tPBiXSG%reU|>)!
kag8WRNi0dV%FR#7OsixtGB7mNHNc|5<lA5I$*Wim0aMN!u>b%7

diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 2a03847df9..6abc17b134 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -510,4 +510,6 @@
 	<string name="download_failed_server_not_found">Download failed: Server not found</string>
 	<string name="download_failed_file_not_found">Download failed: File not found</string>
 	<string name="download_failed_could_not_connect">Download failed: Could not connect to host</string>
+	<string name="pref_use_white_background">Use white background</string>
+	<string name="pref_use_white_background_summary">Show received messages as black text on a white background</string>
 </resources>
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
index 8ab35c0988..6663c22b70 100644
--- a/src/main/res/xml/preferences.xml
+++ b/src/main/res/xml/preferences.xml
@@ -95,6 +95,11 @@
             android:key="use_subject"
             android:summary="@string/pref_conference_name_summary"
             android:title="@string/pref_conference_name"/>
+        <CheckBoxPreference
+            android:defaultValue="false"
+            android:key="use_white_background"
+            android:title="@string/pref_use_white_background"
+            android:summary="@string/pref_use_white_background_summary"/>
         <CheckBoxPreference
             android:defaultValue="false"
             android:key="use_larger_font"