diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 41757188f..eab3a2c91 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -78,7 +78,7 @@ #FFFFFF #FFFFFF + #DDDDDD #FFFFFF #EEEEEE #CCCCCC diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index baec15faf..5574bd375 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -55,11 +55,10 @@ This could mean that someone is trying to interfere with your connection Contact added Done - Messages - (No messages) From: %1$s To: %1$s - New Message + Private Message + New Private Message From: To: Anonymous diff --git a/briar-android/src/org/briarproject/android/PasswordActivity.java b/briar-android/src/org/briarproject/android/PasswordActivity.java index 393b981e9..c309261e6 100644 --- a/briar-android/src/org/briarproject/android/PasswordActivity.java +++ b/briar-android/src/org/briarproject/android/PasswordActivity.java @@ -86,7 +86,9 @@ public class PasswordActivity extends RoboActivity { layout.addView(passwordEntry); // Adjusting the padding of buttons and EditTexts has the wrong results - layout.addView(new FixedVerticalSpace(this)); + FixedVerticalSpace space = new FixedVerticalSpace(this); + space.setHeight(pad); + layout.addView(space); continueButton = new Button(this); continueButton.setLayoutParams(WRAP_WRAP); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 4fb17c599..930193ce0 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -24,6 +24,7 @@ import javax.inject.Inject; import org.briarproject.R; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.HorizontalBorder; +import org.briarproject.android.util.LayoutUtils; import org.briarproject.android.util.ListLoadingProgressBar; import org.briarproject.api.AuthorId; import org.briarproject.api.ContactId; @@ -43,6 +44,8 @@ import org.briarproject.api.messaging.GroupId; import org.briarproject.api.messaging.MessageId; import android.content.Intent; +import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; @@ -100,6 +103,12 @@ implements EventListener, OnClickListener, OnItemClickListener { list = new ListView(this); // Give me all the width and all the unused height list.setLayoutParams(MATCH_WRAP_1); + // Make the dividers the same colour as the background + Resources res = getResources(); + int background = res.getColor(R.color.conversation_background); + list.setBackgroundColor(background); + list.setDivider(new ColorDrawable(background)); + list.setDividerHeight(LayoutUtils.getSeparatorWidth(this)); list.setAdapter(adapter); list.setOnItemClickListener(this); layout.addView(list); diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index 0bf24a24f..d0c2aa1c5 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -1,29 +1,33 @@ package org.briarproject.android.contact; -import static android.view.Gravity.CENTER_HORIZONTAL; -import static android.view.Gravity.CENTER_VERTICAL; -import static android.widget.LinearLayout.HORIZONTAL; -import static android.widget.LinearLayout.VERTICAL; +import static android.view.Gravity.LEFT; +import static android.view.Gravity.RIGHT; +import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT; +import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT; +import static android.widget.RelativeLayout.ALIGN_PARENT_TOP; +import static android.widget.RelativeLayout.BELOW; +import static android.widget.RelativeLayout.LEFT_OF; +import static android.widget.RelativeLayout.RIGHT_OF; import static java.text.DateFormat.SHORT; -import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1; -import static org.briarproject.api.Author.Status.VERIFIED; import java.util.ArrayList; import org.briarproject.R; -import org.briarproject.android.util.AuthorView; +import org.briarproject.android.util.CommonLayoutParams; import org.briarproject.android.util.LayoutUtils; import org.briarproject.api.db.MessageHeader; import org.briarproject.util.StringUtils; import android.content.Context; import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.text.format.DateUtils; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageButton; -import android.widget.LinearLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; class ConversationAdapter extends ArrayAdapter { @@ -43,46 +47,88 @@ class ConversationAdapter extends ArrayAdapter { Context ctx = getContext(); Resources res = ctx.getResources(); - LinearLayout layout = new LinearLayout(ctx); - layout.setOrientation(VERTICAL); - layout.setGravity(CENTER_HORIZONTAL); + RelativeLayout layout = new RelativeLayout(ctx); + int background; if(header.isRead()) background = res.getColor(R.color.read_background); else background = res.getColor(R.color.unread_background); - layout.setBackgroundColor(background); - - LinearLayout headerLayout = new LinearLayout(ctx); - headerLayout.setOrientation(HORIZONTAL); - headerLayout.setGravity(CENTER_VERTICAL); - - AuthorView authorView = new AuthorView(ctx); - authorView.setLayoutParams(WRAP_WRAP_1); - authorView.init(header.getAuthor().getName(), VERIFIED); - headerLayout.addView(authorView); TextView date = new TextView(ctx); + date.setId(1); date.setTextSize(14); - date.setPadding(0, pad, pad, pad); + date.setBackgroundColor(background); + date.setPadding(pad, pad, pad, 0); long then = header.getTimestamp(), now = System.currentTimeMillis(); date.setText(DateUtils.formatSameDayTime(then, now, SHORT, SHORT)); - headerLayout.addView(date); - layout.addView(headerLayout); + View content; if(item.getBody() == null) { TextView ellipsis = new TextView(ctx); - ellipsis.setPadding(pad, 0, pad, pad); ellipsis.setText("\u2026"); - layout.addView(ellipsis); + content = ellipsis; } else if(header.getContentType().equals("text/plain")) { TextView text = new TextView(ctx); - text.setPadding(pad, 0, pad, pad); text.setText(StringUtils.fromUtf8(item.getBody())); - layout.addView(text); + content = text; } else { ImageButton attachment = new ImageButton(ctx); - attachment.setPadding(pad, 0, pad, pad); attachment.setImageResource(R.drawable.content_attachment); - layout.addView(attachment); + content = attachment; + } + content.setId(2); + content.setBackgroundColor(background); + content.setPadding(pad, 0, pad, pad); + + ImageView bubble = new ImageView(ctx); + bubble.setId(3); + + if(header.isLocal()) { + Drawable d; + if(header.isRead()) + d = res.getDrawable(R.drawable.bubble_read_right); + else d = res.getDrawable(R.drawable.bubble_unread_right); + bubble.setImageDrawable(d); + layout.setPadding(d.getIntrinsicWidth(), 0, 0, 0); + date.setGravity(RIGHT); + // Bubble point at the top right, date on top, content below + RelativeLayout.LayoutParams topRight = + CommonLayoutParams.wrapWrap(); + topRight.addRule(ALIGN_PARENT_TOP); + topRight.addRule(ALIGN_PARENT_RIGHT); + layout.addView(bubble, topRight); + RelativeLayout.LayoutParams leftOf = CommonLayoutParams.wrapWrap(); + leftOf.addRule(ALIGN_PARENT_TOP); + leftOf.addRule(ALIGN_PARENT_LEFT); + leftOf.addRule(LEFT_OF, 3); + layout.addView(date, leftOf); + RelativeLayout.LayoutParams below = CommonLayoutParams.wrapWrap(); + below.addRule(ALIGN_PARENT_LEFT); + below.addRule(LEFT_OF, 3); + below.addRule(BELOW, 1); + layout.addView(content, below); + } else { + Drawable d; + if(header.isRead()) + d = res.getDrawable(R.drawable.bubble_read_left); + else d = res.getDrawable(R.drawable.bubble_unread_left); + bubble.setImageDrawable(d); + layout.setPadding(0, 0, d.getIntrinsicWidth(), 0); + date.setGravity(LEFT); + // Bubble point at the top left, date on top, content below + RelativeLayout.LayoutParams topLeft = CommonLayoutParams.wrapWrap(); + topLeft.addRule(ALIGN_PARENT_TOP); + topLeft.addRule(ALIGN_PARENT_LEFT); + layout.addView(bubble, topLeft); + RelativeLayout.LayoutParams rightOf = CommonLayoutParams.wrapWrap(); + rightOf.addRule(ALIGN_PARENT_TOP); + rightOf.addRule(ALIGN_PARENT_RIGHT); + rightOf.addRule(RIGHT_OF, 3); + layout.addView(date, rightOf); + RelativeLayout.LayoutParams below = CommonLayoutParams.wrapWrap(); + below.addRule(ALIGN_PARENT_RIGHT); + below.addRule(RIGHT_OF, 3); + below.addRule(BELOW, 1); + layout.addView(content, below); } return layout; diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java index 7b223a7f2..4bf4e31d9 100644 --- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java @@ -76,7 +76,6 @@ implements OnClickListener { Intent i = getIntent(); contactName = i.getStringExtra("briar.CONTACT_NAME"); if(contactName == null) throw new IllegalStateException(); - setTitle(contactName); byte[] b = i.getByteArrayExtra("briar.LOCAL_AUTHOR_ID"); if(b == null) throw new IllegalStateException(); localAuthorId = new AuthorId(b); diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java index 48e9451b7..b04b8a590 100644 --- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java +++ b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java @@ -99,8 +99,6 @@ implements OnClickListener { layout.setOrientation(VERTICAL); RelativeLayout header = new RelativeLayout(this); - header.setLayoutParams(MATCH_WRAP); - int pad = LayoutUtils.getPadding(this); from = new TextView(this); diff --git a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java index 071195d23..b822d48e6 100644 --- a/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java +++ b/briar-android/src/org/briarproject/android/groups/WriteGroupPostActivity.java @@ -112,8 +112,6 @@ implements OnItemSelectedListener, OnClickListener { layout.setOrientation(VERTICAL); RelativeLayout header = new RelativeLayout(this); - header.setLayoutParams(MATCH_WRAP); - int pad = LayoutUtils.getPadding(this); TextView from = new TextView(this); diff --git a/briar-android/src/org/briarproject/android/util/FixedHorizontalSpace.java b/briar-android/src/org/briarproject/android/util/FixedHorizontalSpace.java new file mode 100644 index 000000000..45810af1b --- /dev/null +++ b/briar-android/src/org/briarproject/android/util/FixedHorizontalSpace.java @@ -0,0 +1,17 @@ +package org.briarproject.android.util; + +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import android.content.Context; +import android.view.View; +import android.view.ViewGroup.LayoutParams; + +public class FixedHorizontalSpace extends View { + + public FixedHorizontalSpace(Context ctx) { + super(ctx); + } + + public void setWidth(int width) { + setLayoutParams(new LayoutParams(width, WRAP_CONTENT)); + } +} diff --git a/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java b/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java index da923d84b..e9625f348 100644 --- a/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java +++ b/briar-android/src/org/briarproject/android/util/FixedVerticalSpace.java @@ -9,7 +9,9 @@ public class FixedVerticalSpace extends View { public FixedVerticalSpace(Context ctx) { super(ctx); - int pad = LayoutUtils.getPadding(ctx); - setLayoutParams(new LayoutParams(WRAP_CONTENT, pad)); + } + + public void setHeight(int height) { + setLayoutParams(new LayoutParams(WRAP_CONTENT, height)); } }