diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 18b68762941190ca4fd64fa65ec023047cd0a2b3..476229541dce9930b1f0b791d91df133d86c4b6c 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -105,25 +105,6 @@ android:value=".android.contact.ContactListActivity" /> </activity> - <activity - android:name=".android.contact.ReadPrivateMessageActivity" - android:label="@string/app_name" - android:parentActivityName=".android.contact.ContactListActivity" > - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value=".android.contact.ContactListActivity" - /> - </activity> - <activity - android:name=".android.contact.WritePrivateMessageActivity" - android:label="@string/app_name" - android:windowSoftInputMode="stateVisible" - android:parentActivityName=".android.contact.ContactListActivity" > - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value=".android.contact.ContactListActivity" - /> - </activity> <activity android:name=".android.forum.AvailableForumsActivity" android:label="@string/available_forums_title" diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index e50540bc2982039a166cd8eb11c5f41608d46c6d..4b79ce4389c2e29951ba8b05f10b055fcab7c2f7 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -37,7 +37,6 @@ import org.briarproject.api.event.EventListener; import org.briarproject.api.event.MessageAddedEvent; import org.briarproject.api.event.MessagesAckedEvent; import org.briarproject.api.event.MessagesSentEvent; -import org.briarproject.api.identity.AuthorId; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateConversation; import org.briarproject.api.messaging.PrivateMessageFactory; @@ -67,14 +66,12 @@ import javax.inject.Inject; import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static org.briarproject.android.contact.ReadPrivateMessageActivity.RESULT_PREV_NEXT; import static org.briarproject.api.messaging.PrivateMessageHeader.Status.DELIVERED; import static org.briarproject.api.messaging.PrivateMessageHeader.Status.SENT; public class ConversationActivity extends BriarActivity implements EventListener, OnClickListener { - private static final int REQUEST_READ = 2; private static final Logger LOG = Logger.getLogger(ConversationActivity.class.getName()); @@ -96,7 +93,6 @@ public class ConversationActivity extends BriarActivity private volatile String contactName = null; private volatile GroupId groupId = null; private volatile PrivateConversation conversation = null; - private volatile AuthorId localAuthorId = null; private volatile boolean connected; @Override @@ -108,10 +104,6 @@ public class ConversationActivity extends BriarActivity if (id == -1) throw new IllegalStateException(); contactId = new ContactId(id); - Intent data = new Intent(); - data.putExtra("briar.CONTACT_ID", id); - setResult(RESULT_OK, data); - setContentView(R.layout.activity_conversation); adapter = new ConversationAdapter(this); @@ -141,23 +133,13 @@ public class ConversationActivity extends BriarActivity if (isFinishing()) markMessagesRead(); } - @Override - protected void onActivityResult(int request, int result, Intent data) { - super.onActivityResult(request, result, data); - if (request == REQUEST_READ && result == RESULT_PREV_NEXT) { - int position = data.getIntExtra("briar.POSITION", -1); - if (position >= 0 && position < adapter.getItemCount()) - displayMessage(position); - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.contact_actions, menu); - // adapt icon color to dark action bar + // Adapt icon color to dark action bar menu.findItem(R.id.action_social_remove_person).getIcon().setColorFilter( getResources().getColor(R.color.action_bar_text), PorterDuff.Mode.SRC_IN); @@ -171,7 +153,6 @@ public class ConversationActivity extends BriarActivity switch (item.getItemId()) { case R.id.action_social_remove_person: askToRemoveContact(); - return true; default: return super.onOptionsItemSelected(item); @@ -185,7 +166,6 @@ public class ConversationActivity extends BriarActivity long now = System.currentTimeMillis(); Contact contact = contactManager.getContact(contactId); contactName = contact.getAuthor().getName(); - localAuthorId = contact.getLocalAuthorId(); groupId = messagingManager.getConversationId(contactId); conversation = messagingManager.getConversation(groupId); connected = connectionRegistry.isConnected(contactId); @@ -458,23 +438,6 @@ public class ConversationActivity extends BriarActivity }); } - private void displayMessage(int position) { - ConversationItem item = adapter.getItem(position); - PrivateMessageHeader header = item.getHeader(); - Intent i = new Intent(this, ReadPrivateMessageActivity.class); - i.putExtra("briar.CONTACT_ID", contactId.getInt()); - i.putExtra("briar.CONTACT_NAME", contactName); - i.putExtra("briar.GROUP_ID", groupId.getBytes()); - i.putExtra("briar.LOCAL_AUTHOR_ID", localAuthorId.getBytes()); - i.putExtra("briar.AUTHOR_NAME", header.getAuthor().getName()); - i.putExtra("briar.MESSAGE_ID", header.getId().getBytes()); - i.putExtra("briar.CONTENT_TYPE", header.getContentType()); - i.putExtra("briar.TIMESTAMP", header.getTimestamp()); - i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewMessage()); - i.putExtra("briar.POSITION", position); - startActivityForResult(i, REQUEST_READ); - } - private void askToRemoveContact() { runOnUiThread(new Runnable() { @Override @@ -523,10 +486,8 @@ public class ConversationActivity extends BriarActivity String deleted = getString(R.string.contact_deleted_toast); Toast.makeText(ConversationActivity.this, deleted, LENGTH_SHORT) .show(); - finish(); } }); } - } diff --git a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java deleted file mode 100644 index 01ba0030336eb2ae066eca735caa921fe5b447bf..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/contact/ReadPrivateMessageActivity.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.briarproject.android.contact; - -import android.content.Intent; -import android.content.res.Resources; -import android.os.Bundle; -import android.text.format.DateUtils; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.widget.ScrollView; -import android.widget.TextView; - -import org.briarproject.R; -import org.briarproject.android.BriarActivity; -import org.briarproject.android.util.AuthorView; -import org.briarproject.android.util.ElasticHorizontalSpace; -import org.briarproject.android.util.HorizontalBorder; -import org.briarproject.android.util.LayoutUtils; -import org.briarproject.api.db.DbException; -import org.briarproject.api.db.NoSuchMessageException; -import org.briarproject.api.identity.AuthorId; -import org.briarproject.api.messaging.MessagingManager; -import org.briarproject.api.sync.GroupId; -import org.briarproject.api.sync.MessageId; -import org.briarproject.util.StringUtils; - -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.view.Gravity.CENTER; -import static android.view.Gravity.CENTER_VERTICAL; -import static android.widget.LinearLayout.HORIZONTAL; -import static android.widget.LinearLayout.VERTICAL; -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; -import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP; -import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP_1; -import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP_1; -import static org.briarproject.api.identity.Author.Status.VERIFIED; - -@Deprecated -public class ReadPrivateMessageActivity extends BriarActivity -implements OnClickListener { - - static final int RESULT_REPLY = RESULT_FIRST_USER; - static final int RESULT_PREV_NEXT = RESULT_FIRST_USER + 1; - - private static final Logger LOG = - Logger.getLogger(ReadPrivateMessageActivity.class.getName()); - - private String contactName = null; - private AuthorId localAuthorId = null; - private long timestamp = -1, minTimestamp = -1; - private ImageButton prevButton = null, nextButton = null; - private ImageButton replyButton = null; - private TextView content = null; - private int position = -1; - - // Fields that are accessed from background threads must be volatile - @Inject private volatile MessagingManager messagingManager; - private volatile MessageId messageId = null; - private volatile GroupId groupId = null; - - @Override - public void onCreate(Bundle state) { - super.onCreate(state); - - 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); - String authorName = i.getStringExtra("briar.AUTHOR_NAME"); - if (authorName == null) throw new IllegalStateException(); - b = i.getByteArrayExtra("briar.MESSAGE_ID"); - if (b == null) throw new IllegalStateException(); - messageId = new MessageId(b); - b = i.getByteArrayExtra("briar.GROUP_ID"); - if (b == null) throw new IllegalStateException(); - groupId = new GroupId(b); - String contentType = i.getStringExtra("briar.CONTENT_TYPE"); - if (contentType == null) throw new IllegalStateException(); - timestamp = i.getLongExtra("briar.TIMESTAMP", -1); - if (timestamp == -1) throw new IllegalStateException(); - minTimestamp = i.getLongExtra("briar.MIN_TIMESTAMP", -1); - if (minTimestamp == -1) throw new IllegalStateException(); - position = i.getIntExtra("briar.POSITION", -1); - if (position == -1) throw new IllegalStateException(); - - LinearLayout layout = new LinearLayout(this); - layout.setLayoutParams(MATCH_WRAP); - layout.setOrientation(VERTICAL); - - ScrollView scrollView = new ScrollView(this); - scrollView.setLayoutParams(MATCH_WRAP_1); - - LinearLayout message = new LinearLayout(this); - message.setOrientation(VERTICAL); - - LinearLayout header = new LinearLayout(this); - header.setLayoutParams(MATCH_WRAP); - header.setOrientation(HORIZONTAL); - header.setGravity(CENTER_VERTICAL); - - AuthorView author = new AuthorView(this); - author.setLayoutParams(WRAP_WRAP_1); - author.init(authorName, VERIFIED); - header.addView(author); - - int pad = LayoutUtils.getPadding(this); - - TextView date = new TextView(this); - date.setPadding(0, pad, pad, pad); - date.setText(DateUtils.getRelativeTimeSpanString(this, timestamp)); - header.addView(date); - message.addView(header); - - if (contentType.equals("text/plain")) { - // Load and display the message body - content = new TextView(this); - content.setPadding(pad, 0, pad, pad); - message.addView(content); - loadMessageBody(); - } - scrollView.addView(message); - layout.addView(scrollView); - - layout.addView(new HorizontalBorder(this)); - - LinearLayout footer = new LinearLayout(this); - footer.setLayoutParams(MATCH_WRAP); - footer.setOrientation(HORIZONTAL); - footer.setGravity(CENTER); - Resources res = getResources(); - footer.setBackgroundColor(res.getColor(R.color.button_bar_background)); - - prevButton = new ImageButton(this); - prevButton.setBackgroundResource(0); - prevButton.setImageResource(R.drawable.navigation_previous_item); - prevButton.setOnClickListener(this); - footer.addView(prevButton); - 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 ElasticHorizontalSpace(this)); - - replyButton = new ImageButton(this); - replyButton.setBackgroundResource(0); - replyButton.setImageResource(R.drawable.social_reply); - replyButton.setOnClickListener(this); - footer.addView(replyButton); - layout.addView(footer); - - setContentView(layout); - } - - @Override - public void onPause() { - super.onPause(); - if (isFinishing()) markMessageRead(); - } - - private void markMessageRead() { - runOnDbThread(new Runnable() { - public void run() { - try { - long now = System.currentTimeMillis(); - messagingManager.setReadFlag(messageId, true); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Marking read took " + duration + " ms"); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - private void loadMessageBody() { - runOnDbThread(new Runnable() { - public void run() { - try { - long now = System.currentTimeMillis(); - byte[] body = messagingManager.getMessageBody(messageId); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Loading message took " + duration + " ms"); - displayMessageBody(StringUtils.fromUtf8(body)); - } catch (NoSuchMessageException e) { - finishOnUiThread(); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - private void displayMessageBody(final String body) { - runOnUiThread(new Runnable() { - public void run() { - content.setText(body); - } - }); - } - - public void onClick(View view) { - if (view == prevButton) { - Intent i = new Intent(); - i.putExtra("briar.POSITION", position - 1); - setResult(RESULT_PREV_NEXT, i); - finish(); - } else if (view == nextButton) { - Intent i = new Intent(); - i.putExtra("briar.POSITION", position + 1); - setResult(RESULT_PREV_NEXT, i); - finish(); - } else if (view == replyButton) { - Intent i = new Intent(this, WritePrivateMessageActivity.class); - i.putExtra("briar.CONTACT_NAME", contactName); - i.putExtra("briar.GROUP_ID", groupId.getBytes()); - i.putExtra("briar.LOCAL_AUTHOR_ID", - localAuthorId.getBytes()); - i.putExtra("briar.PARENT_ID", messageId.getBytes()); - i.putExtra("briar.MIN_TIMESTAMP", minTimestamp); - startActivity(i); - setResult(RESULT_REPLY); - finish(); - } - } -} diff --git a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java b/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java deleted file mode 100644 index 74623463e43d026a5aa4d332bf6034d284eb6aba..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/contact/WritePrivateMessageActivity.java +++ /dev/null @@ -1,224 +0,0 @@ -package org.briarproject.android.contact; - -import android.content.Intent; -import android.os.Bundle; -import android.text.InputType; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; - -import org.briarproject.R; -import org.briarproject.android.BriarActivity; -import org.briarproject.android.util.CommonLayoutParams; -import org.briarproject.android.util.LayoutUtils; -import org.briarproject.api.crypto.CryptoExecutor; -import org.briarproject.api.db.DbException; -import org.briarproject.api.db.NoSuchContactException; -import org.briarproject.api.db.NoSuchSubscriptionException; -import org.briarproject.api.identity.AuthorId; -import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.LocalAuthor; -import org.briarproject.api.messaging.MessagingManager; -import org.briarproject.api.messaging.PrivateConversation; -import org.briarproject.api.messaging.PrivateMessageFactory; -import org.briarproject.api.sync.GroupId; -import org.briarproject.api.sync.Message; -import org.briarproject.api.sync.MessageId; -import org.briarproject.util.StringUtils; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.concurrent.Executor; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.text.InputType.TYPE_CLASS_TEXT; -import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES; -import static android.text.TextUtils.TruncateAt.END; -import static android.widget.LinearLayout.VERTICAL; -import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT; -import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT; -import static android.widget.RelativeLayout.CENTER_VERTICAL; -import static android.widget.RelativeLayout.LEFT_OF; -import static android.widget.Toast.LENGTH_LONG; -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; -import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP; - -public class WritePrivateMessageActivity extends BriarActivity -implements OnClickListener { - - private static final Logger LOG = - Logger.getLogger(WritePrivateMessageActivity.class.getName()); - - @Inject @CryptoExecutor private Executor cryptoExecutor; - private TextView from = null; - private ImageButton sendButton = null; - private EditText content = null; - - // Fields that are accessed from background threads must be volatile - @Inject private volatile IdentityManager identityManager; - @Inject private volatile MessagingManager messagingManager; - @Inject private volatile PrivateMessageFactory privateMessageFactory; - private volatile GroupId groupId = null; - private volatile AuthorId localAuthorId = null; - private volatile MessageId parentId = null; - private volatile long minTimestamp = -1; - private volatile LocalAuthor localAuthor = null; - private volatile PrivateConversation conversation = null; - - @Override - public void onCreate(Bundle state) { - super.onCreate(state); - - Intent i = getIntent(); - String contactName = i.getStringExtra("briar.CONTACT_NAME"); - if (contactName == null) throw new IllegalStateException(); - setTitle(contactName); - byte[] b = i.getByteArrayExtra("briar.GROUP_ID"); - if (b == null) throw new IllegalStateException(); - groupId = new GroupId(b); - b = i.getByteArrayExtra("briar.LOCAL_AUTHOR_ID"); - if (b == null) throw new IllegalStateException(); - minTimestamp = i.getLongExtra("briar.MIN_TIMESTAMP", -1); - if (minTimestamp == -1) throw new IllegalStateException(); - localAuthorId = new AuthorId(b); - b = i.getByteArrayExtra("briar.PARENT_ID"); - if (b != null) parentId = new MessageId(b); - - LinearLayout layout = new LinearLayout(this); - layout.setLayoutParams(MATCH_WRAP); - layout.setOrientation(VERTICAL); - int pad = LayoutUtils.getPadding(this); - layout.setPadding(pad, 0, pad, pad); - - RelativeLayout header = new RelativeLayout(this); - - from = new TextView(this); - from.setId(1); - from.setTextSize(18); - from.setSingleLine(); - from.setEllipsize(END); - from.setPadding(0, 0, pad, 0); - from.setText(R.string.from); - RelativeLayout.LayoutParams leftOf = CommonLayoutParams.relative(); - leftOf.addRule(ALIGN_PARENT_LEFT); - leftOf.addRule(CENTER_VERTICAL); - leftOf.addRule(LEFT_OF, 2); - header.addView(from, leftOf); - - sendButton = new ImageButton(this); - sendButton.setId(2); - sendButton.setBackgroundResource(0); - sendButton.setImageResource(R.drawable.social_send_now); - sendButton.setEnabled(false); // Enabled after loading the conversation - sendButton.setOnClickListener(this); - RelativeLayout.LayoutParams right = CommonLayoutParams.relative(); - right.addRule(ALIGN_PARENT_RIGHT); - right.addRule(CENTER_VERTICAL); - header.addView(sendButton, right); - layout.addView(header); - - content = new EditText(this); - content.setId(3); - int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE - | TYPE_TEXT_FLAG_CAP_SENTENCES; - content.setInputType(inputType); - content.setHint(R.string.private_message_hint); - layout.addView(content); - - setContentView(layout); - } - - @Override - public void onResume() { - super.onResume(); - if (localAuthor == null || conversation == null) - loadAuthorAndConversation(); - } - - private void loadAuthorAndConversation() { - runOnDbThread(new Runnable() { - public void run() { - try { - long now = System.currentTimeMillis(); - localAuthor = identityManager.getLocalAuthor(localAuthorId); - conversation = messagingManager.getConversation(groupId); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Load took " + duration + " ms"); - displayLocalAuthor(); - } catch (NoSuchContactException e) { - finishOnUiThread(); - } catch (NoSuchSubscriptionException e) { - finishOnUiThread(); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - private void displayLocalAuthor() { - runOnUiThread(new Runnable() { - public void run() { - String format = getString(R.string.format_from); - String name = localAuthor.getName(); - from.setText(String.format(format, name)); - sendButton.setEnabled(true); - } - }); - } - - public void onClick(View view) { - String message = content.getText().toString(); - if (message.equals("")) return; - createMessage(StringUtils.toUtf8(message)); - Toast.makeText(this, R.string.message_sent_toast, LENGTH_LONG).show(); - finish(); - } - - private void createMessage(final byte[] body) { - cryptoExecutor.execute(new Runnable() { - public void run() { - // Don't use an earlier timestamp than the newest message - long timestamp = System.currentTimeMillis(); - timestamp = Math.max(timestamp, minTimestamp); - try { - Message m = privateMessageFactory.createPrivateMessage( - parentId, conversation, "text/plain", timestamp, - body); - storeMessage(m); - } catch (GeneralSecurityException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }); - } - - private void storeMessage(final Message m) { - runOnDbThread(new Runnable() { - public void run() { - try { - long now = System.currentTimeMillis(); - messagingManager.addLocalMessage(m); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Storing message took " + duration + " ms"); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } -}