diff --git a/proguard.cfg b/proguard.cfg
index 417bcc16e2..c7d20acd46 100644
--- a/proguard.cfg
+++ b/proguard.cfg
@@ -1,5 +1,6 @@
-keepattributes **
--keep class !android.support.v7.internal.view.menu.**,!org.spongycastle.asn1.**,!org.spongycastle.crypto.ec.**,!org.spongycastle.x509.**,** {*;}
+
+-keep class !org.spongycastle.crypto.tls.**,!com.doomonafireball.betterpickers.**,!org.w3c.**,!android.support.v7.internal.view.menu.**,!org.spongycastle.asn1.**,!org.spongycastle.crypto.ec.**,!org.spongycastle.x509.**,!org.spongycastle.crypto.agreement.**,!org.spongycastle.crypto.ec.**,!org.spongycastle.math.**,!org.spongycastle.pqc.**,!org.spongycastle.jcajce.provider.asymmetric.**,!org.apache.http.**,** {*;}
-dontpreverify
-dontoptimize
-dontwarn **
diff --git a/res/layout/message_details_recipient.xml b/res/layout/message_details_recipient.xml
index c5c2648ccb..4c5f2117a5 100644
--- a/res/layout/message_details_recipient.xml
+++ b/res/layout/message_details_recipient.xml
@@ -67,7 +67,8 @@
android:paddingBottom="5dp"
android:layout_gravity="center_vertical"
android:drawableLeft="@drawable/ic_error_white_18dp"
- android:text="FIX" />
+ android:text="FIX"
+ android:visibility="gone"/>
+ android:text="RESEND"
+ android:visibility="gone"/>
diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java
index e527ec45a6..ca63bf5172 100644
--- a/src/org/thoughtcrime/securesms/ConversationItem.java
+++ b/src/org/thoughtcrime/securesms/ConversationItem.java
@@ -332,9 +332,8 @@ public class ConversationItem extends LinearLayout {
}
private void setEvents(MessageRecord messageRecord) {
- setClickable(messageRecord.isPendingSmsFallback() ||
- messageRecord.hasNetworkFailures() ||
- messageRecord.isIdentityMismatchFailure() ||
+ setClickable(messageRecord.isFailed()||
+ messageRecord.isPendingSmsFallback() ||
(messageRecord.isKeyExchange() &&
!messageRecord.isCorruptedKeyExchange() &&
!messageRecord.isOutgoing()));
@@ -573,12 +572,12 @@ public class ConversationItem extends LinearLayout {
private class ClickListener implements View.OnClickListener {
public void onClick(View v) {
- if (messageRecord.isIdentityMismatchFailure() || messageRecord.hasNetworkFailures()) {
+ if (messageRecord.isFailed()) {
Intent intent = new Intent(context, MessageDetailsActivity.class);
intent.putExtra(MessageDetailsActivity.MASTER_SECRET_EXTRA, masterSecret);
intent.putExtra(MessageDetailsActivity.MESSAGE_ID_EXTRA, messageRecord.getId());
intent.putExtra(MessageDetailsActivity.TYPE_EXTRA, messageRecord.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT);
- intent.putExtra(MessageDetailsActivity.PUSH_EXTRA, pushDestination);
+ intent.putExtra(MessageDetailsActivity.IS_PUSH_GROUP_EXTRA, groupThread && pushDestination);
context.startActivity(intent);
} else if (messageRecord.isKeyExchange() &&
!messageRecord.isOutgoing() &&
diff --git a/src/org/thoughtcrime/securesms/MessageDetailsActivity.java b/src/org/thoughtcrime/securesms/MessageDetailsActivity.java
index d13a443904..c979a159b3 100644
--- a/src/org/thoughtcrime/securesms/MessageDetailsActivity.java
+++ b/src/org/thoughtcrime/securesms/MessageDetailsActivity.java
@@ -55,10 +55,11 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity
public final static String MASTER_SECRET_EXTRA = "master_secret";
public final static String MESSAGE_ID_EXTRA = "message_id";
+ public final static String IS_PUSH_GROUP_EXTRA = "is_push_group";
public final static String TYPE_EXTRA = "type";
- public final static String PUSH_EXTRA = "push";
private MasterSecret masterSecret;
+ private boolean isPushGroup;
private ConversationItem conversationItem;
private ViewGroup itemParent;
private TextView sentDate;
@@ -84,6 +85,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity
View header = inflater.inflate(R.layout.message_details_header, recipientsList, false);
masterSecret = getIntent().getParcelableExtra(MASTER_SECRET_EXTRA);
+ isPushGroup = getIntent().getBooleanExtra(IS_PUSH_GROUP_EXTRA, false);
itemParent = (ViewGroup) findViewById(R.id.item_container );
recipientsList = (ListView ) findViewById(R.id.recipients_list);
sentDate = (TextView ) header.findViewById(R.id.sent_time);
@@ -142,7 +144,8 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity
conversationItem.set(masterSecret, messageRecord, new HashSet(), null,
recipients != messageRecord.getRecipients(),
DirectoryHelper.isPushDestination(this, recipients));
- recipientsList.setAdapter(new MessageDetailsRecipientAdapter(this, masterSecret, messageRecord, recipients));
+ recipientsList.setAdapter(new MessageDetailsRecipientAdapter(this, masterSecret, messageRecord,
+ recipients, isPushGroup));
}
private void inflateMessageViewIfAbsent(MessageRecord messageRecord) {
diff --git a/src/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java b/src/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java
index 9b371ab338..39c1834f61 100644
--- a/src/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java
+++ b/src/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java
@@ -9,20 +9,26 @@ import android.widget.BaseAdapter;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.model.MessageRecord;
+import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.Recipients;
public class MessageDetailsRecipientAdapter extends BaseAdapter implements AbsListView.RecyclerListener {
- private Context context;
- private MasterSecret masterSecret;
- private MessageRecord record;
- private Recipients recipients;
+ private final Context context;
+ private final MasterSecret masterSecret;
+ private final MessageRecord record;
+ private final Recipients recipients;
+ private final boolean isPushGroup;
- public MessageDetailsRecipientAdapter(Context context, MasterSecret masterSecret, MessageRecord record, Recipients recipients) {
+ public MessageDetailsRecipientAdapter(Context context, MasterSecret masterSecret,
+ MessageRecord record, Recipients recipients,
+ boolean isPushGroup)
+ {
this.context = context;
this.masterSecret = masterSecret;
this.record = record;
this.recipients = recipients;
+ this.isPushGroup = isPushGroup;
}
@Override
@@ -46,7 +52,8 @@ public class MessageDetailsRecipientAdapter extends BaseAdapter implements AbsLi
convertView = LayoutInflater.from(context).inflate(R.layout.message_details_recipient, parent, false);
}
- ((MessageRecipientListItem)convertView).set(masterSecret, record, recipients, position);
+ Recipient recipient = recipients.getRecipientsList().get(position);
+ ((MessageRecipientListItem)convertView).set(masterSecret, record, recipient, isPushGroup);
return convertView;
}
diff --git a/src/org/thoughtcrime/securesms/MessageRecipientListItem.java b/src/org/thoughtcrime/securesms/MessageRecipientListItem.java
index af721ebb44..11dbdad6b2 100644
--- a/src/org/thoughtcrime/securesms/MessageRecipientListItem.java
+++ b/src/org/thoughtcrime/securesms/MessageRecipientListItem.java
@@ -34,7 +34,6 @@ import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.util.RecipientViewUtil;
@@ -74,42 +73,58 @@ public class MessageRecipientListItem extends RelativeLayout
this.resendButton = (Button) findViewById(R.id.resend_button);
}
- public void set(final MasterSecret masterSecret, final MessageRecord record, final Recipients recipients, final int position) {
- recipient = recipients.getRecipientsList().get(position);
+ public void set(final MasterSecret masterSecret,
+ final MessageRecord record,
+ final Recipient recipient,
+ final boolean isPushGroup)
+ {
+ this.recipient = recipient;
+
recipient.addListener(this);
fromView.setText(RecipientViewUtil.formatFrom(getContext(), recipient));
RecipientViewUtil.setContactPhoto(getContext(), contactPhotoImage, recipient, false);
- setIssueIndicators(masterSecret, record);
+ setIssueIndicators(masterSecret, record, isPushGroup);
}
- private void setIssueIndicators(final MasterSecret masterSecret, final MessageRecord record) {
+ private void setIssueIndicators(final MasterSecret masterSecret,
+ final MessageRecord record,
+ final boolean isPushGroup)
+ {
final NetworkFailure networkFailure = getNetworkFailure(record);
final IdentityKeyMismatch keyMismatch = networkFailure == null ? getKeyMismatch(record) : null;
String errorText = "";
- if (networkFailure != null) {
- errorText = getContext().getString(R.string.MessageDetailsRecipient_failed_to_send);
- resendButton.setOnClickListener(new OnClickListener() {
+
+ if (keyMismatch != null) {
+ resendButton.setVisibility(View.GONE);
+ conflictButton.setVisibility(View.VISIBLE);
+
+ errorText = getContext().getString(R.string.MessageDetailsRecipient_new_identity);
+ conflictButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- new ResendAsyncTask(masterSecret, record, networkFailure).execute();
+ new ConfirmIdentityDialog(getContext(), masterSecret, record, keyMismatch).show();
}
});
- } else if (keyMismatch != null) {
- errorText = getContext().getString(R.string.MessageDetailsRecipient_new_identity);
- conflictButton.setOnClickListener(new OnClickListener() {
+ } else if (networkFailure != null || (!isPushGroup && record.isFailed())) {
+ resendButton.setVisibility(View.VISIBLE);
+ conflictButton.setVisibility(View.GONE);
+
+ errorText = getContext().getString(R.string.MessageDetailsRecipient_failed_to_send);
+ resendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- new ConfirmIdentityDialog(getContext(), masterSecret, record, keyMismatch).show();
+ new ResendAsyncTask(masterSecret, record, networkFailure).execute();
}
});
+ } else {
+ resendButton.setVisibility(View.GONE);
+ conflictButton.setVisibility(View.GONE);
}
errorDescription.setText(errorText);
errorDescription.setVisibility(TextUtils.isEmpty(errorText) ? View.GONE : View.VISIBLE);
- resendButton.setVisibility(networkFailure != null ? View.VISIBLE : View.GONE);
- conflictButton.setVisibility(keyMismatch != null ? View.VISIBLE : View.GONE);
}
private NetworkFailure getNetworkFailure(final MessageRecord record) {