diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 9ab5490ca8f1c68e394ad200a6aa02f224c60598..92486abf3bd87f4e6a8982c4ceb6909747448989 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -43,5 +43,5 @@ <string name="messages_title">Messages</string> <string name="message_from">From: %1$s</string> <string name="compose_title">New Message</string> - <string name="message_to">To: %1$s</string> + <string name="message_to">To:</string> </resources> diff --git a/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java b/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..168d7aa81ee78d694e55999c3cd80df44597b5a9 --- /dev/null +++ b/briar-android/src/net/sf/briar/android/messages/ContactNameSpinnerAdapter.java @@ -0,0 +1,35 @@ +package net.sf.briar.android.messages; + +import java.util.ArrayList; + +import net.sf.briar.api.Contact; +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.SpinnerAdapter; +import android.widget.TextView; + +class ContactNameSpinnerAdapter extends ArrayAdapter<Contact> +implements SpinnerAdapter { + + ContactNameSpinnerAdapter(Context context) { + super(context, android.R.layout.simple_spinner_item, + new ArrayList<Contact>()); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TextView name = new TextView(getContext()); + name.setTextSize(18); + name.setPadding(10, 10, 10, 10); + name.setText(getItem(position).getName()); + return name; + } + + @Override + public View getDropDownView(int position, View convertView, + ViewGroup parent) { + return getView(position, convertView, parent); + } +} diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java index 5133f5cb065d2191b20d91f9cbbda8c73ff37ee6..ec063dfba0e22368be36b5979f53f9f6035518ef 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java @@ -168,7 +168,6 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { public void onClick(View view) { Intent i = new Intent(this, WriteMessageActivity.class); i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt()); - i.putExtra("net.sf.briar.CONTACT_NAME", contactName); startActivity(i); } diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java index 56045f7db5699532e0ecf5c06c6fa191ace2b4d4..296d7f95a17aa6f33cdeaa8aa0f55a3e67b22ce8 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java @@ -169,7 +169,7 @@ implements OnClickListener, DatabaseListener { } public void onClick(View view) { - // FIXME: Hook this button up to an activity + startActivity(new Intent(this, WriteMessageActivity.class)); } public void eventOccurred(DatabaseEvent e) { diff --git a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java index 24a724da5605cf23d4692f3ad908081f0a2ed9a8..00adfb06e6047b32b9295e65c28256a32edd0dfb 100644 --- a/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ReadMessageActivity.java @@ -278,7 +278,6 @@ implements OnClickListener { } else if(view == replyButton) { Intent i = new Intent(this, WriteMessageActivity.class); i.putExtra("net.sf.briar.CONTACT_ID", contactId.getInt()); - i.putExtra("net.sf.briar.CONTACT_NAME", contactName); i.putExtra("net.sf.briar.PARENT_ID", messageId.getBytes()); startActivity(i); setResult(RESULT_REPLY); diff --git a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java index 4dc25a4580be768619e74275e30f6d5c9d34539c..fc54d5fb4b6abd5a6a5813d05dcef40268913eb3 100644 --- a/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/WriteMessageActivity.java @@ -8,6 +8,7 @@ import static java.util.logging.Level.WARNING; import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -16,6 +17,8 @@ import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.CommonLayoutParams; +import net.sf.briar.android.widgets.HorizontalSpace; +import net.sf.briar.api.Contact; import net.sf.briar.api.ContactId; import net.sf.briar.api.android.BundleEncrypter; import net.sf.briar.api.db.DatabaseComponent; @@ -29,15 +32,18 @@ import android.os.Bundle; import android.os.Parcelable; import android.view.View; import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; +import android.widget.Spinner; import android.widget.TextView; import com.google.inject.Inject; public class WriteMessageActivity extends BriarActivity -implements OnClickListener { +implements OnClickListener, OnItemSelectedListener { private static final Logger LOG = Logger.getLogger(WriteMessageActivity.class.getName()); @@ -51,8 +57,9 @@ implements OnClickListener { @Inject private MessageFactory messageFactory; private ContactId contactId = null; - private String contactName = null; private MessageId parentId = null; + private ContactNameSpinnerAdapter adapter = null; + private ImageButton sendButton = null; private EditText content = null; @Override @@ -61,10 +68,7 @@ implements OnClickListener { Intent i = getIntent(); int cid = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); - if(cid == -1) throw new IllegalStateException(); - contactId = new ContactId(cid); - contactName = i.getStringExtra("net.sf.briar.CONTACT_NAME"); - if(contactName == null) throw new IllegalStateException(); + if(cid != -1) contactId = new ContactId(cid); byte[] pid = i.getByteArrayExtra("net.sf.briar.PARENT_ID"); if(pid != null) parentId = new MessageId(pid); @@ -78,17 +82,46 @@ implements OnClickListener { actionBar.setGravity(CENTER_VERTICAL); TextView to = new TextView(this); - // Give me all the unused width - to.setLayoutParams(CommonLayoutParams.WRAP_WRAP_1); to.setTextSize(18); to.setPadding(10, 10, 10, 10); - String format = getResources().getString(R.string.message_to); - to.setText(String.format(format, contactName)); + to.setText(R.string.message_to); actionBar.addView(to); - ImageButton sendButton = new ImageButton(this); + adapter = new ContactNameSpinnerAdapter(this); + final Spinner spinner = new Spinner(this); + spinner.setAdapter(adapter); + spinner.setOnItemSelectedListener(this); + dbExecutor.execute(new Runnable() { + public void run() { + try { + serviceConnection.waitForStartup(); + final Collection<Contact> contacts = db.getContacts(); + runOnUiThread(new Runnable() { + public void run() { + for(Contact c : contacts) { + if(c.getId().equals(contactId)) + spinner.setSelection(adapter.getCount()); + adapter.add(c); + } + } + }); + } catch(DbException e) { + if(LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } catch(InterruptedException e) { + LOG.info("Interrupted while waiting for service"); + Thread.currentThread().interrupt(); + } + } + }); + actionBar.addView(spinner); + + actionBar.addView(new HorizontalSpace(this)); + + sendButton = new ImageButton(this); sendButton.setBackgroundResource(0); sendButton.setImageResource(R.drawable.social_send_now); + sendButton.setEnabled(false); sendButton.setOnClickListener(this); actionBar.addView(sendButton); layout.addView(actionBar); @@ -122,6 +155,7 @@ implements OnClickListener { } public void onClick(View view) { + if(contactId == null) throw new IllegalStateException(); final Message m; try { byte[] body = content.getText().toString().getBytes("UTF-8"); @@ -150,4 +184,15 @@ implements OnClickListener { }); finish(); } + + public void onItemSelected(AdapterView<?> parent, View view, int position, + long id) { + contactId = adapter.getItem(position).getId(); + sendButton.setEnabled(true); + } + + public void onNothingSelected(AdapterView<?> parent) { + contactId = null; + sendButton.setEnabled(false); + } }