diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index ac321b93a01c97cde46bbf609858c5fb8d9d3704..7fa673e49826636ff5532b5aee63caa58ea79760 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -12,9 +12,6 @@ import javax.inject.Inject; import org.briarproject.R; import org.briarproject.android.BriarActivity; -import org.briarproject.android.identity.LocalAuthorItem; -import org.briarproject.android.identity.LocalAuthorItemComparator; -import org.briarproject.android.identity.LocalAuthorSpinnerAdapter; import org.briarproject.api.AuthorId; import org.briarproject.api.LocalAuthor; import org.briarproject.api.android.DatabaseUiExecutor; @@ -35,6 +32,9 @@ import android.widget.Toast; public class AddContactActivity extends BriarActivity implements InvitationListener { + static final int REQUEST_BLUETOOTH = 1; + static final int REQUEST_CREATE_IDENTITY = 2; + private static final Logger LOG = Logger.getLogger(AddContactActivity.class.getName()); @@ -169,9 +169,14 @@ implements InvitationListener { @Override public void onActivityResult(int request, int result, Intent data) { - // This is the result of enabling Bluetooth - if(result != RESULT_CANCELED) - reset(new InvitationCodeView(this)); + if(request == REQUEST_BLUETOOTH) { + if(result != RESULT_CANCELED) reset(new InvitationCodeView(this)); + } else if(request == REQUEST_CREATE_IDENTITY && result == RESULT_OK) { + byte[] b = data.getByteArrayExtra("briar.LOCAL_AUTHOR_ID"); + if(b == null) throw new IllegalStateException(); + localAuthorId = new AuthorId(b); + setView(new ChooseIdentityView(this)); + } } void setView(AddContactView view) { @@ -193,17 +198,17 @@ implements InvitationListener { setView(view); } - void loadLocalAuthors(final LocalAuthorSpinnerAdapter adapter) { + void loadLocalAuthors() { dbUiExecutor.execute(new Runnable() { public void run() { try { lifecycleManager.waitForDatabase(); long now = System.currentTimeMillis(); - Collection<LocalAuthor> localAuthors = db.getLocalAuthors(); + Collection<LocalAuthor> authors = db.getLocalAuthors(); long duration = System.currentTimeMillis() - now; if(LOG.isLoggable(INFO)) LOG.info("Loading authors took " + duration + " ms"); - displayLocalAuthors(adapter, localAuthors); + displayLocalAuthors(authors); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -215,16 +220,13 @@ implements InvitationListener { }); } - private void displayLocalAuthors(final LocalAuthorSpinnerAdapter adapter, - final Collection<LocalAuthor> localAuthors) { + // FIXME: The interaction between views and the container is horrible + private void displayLocalAuthors(final Collection<LocalAuthor> authors) { runOnUiThread(new Runnable() { public void run() { - if(localAuthors.isEmpty()) throw new IllegalStateException(); - adapter.clear(); - for(LocalAuthor a : localAuthors) - adapter.add(new LocalAuthorItem(a)); - adapter.sort(LocalAuthorItemComparator.INSTANCE); - adapter.notifyDataSetChanged(); + AddContactView view = AddContactActivity.this.view; + if(view instanceof ChooseIdentityView) + ((ChooseIdentityView) view).displayLocalAuthors(authors); } }); } diff --git a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java index e6593fed0752bb135d8e011be4a6cfaa6b91d435..81070413db31deec48454ff39114d516ccd4673b 100644 --- a/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java +++ b/briar-android/src/org/briarproject/android/invitation/ChooseIdentityView.java @@ -4,13 +4,20 @@ import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION; import static android.view.Gravity.CENTER; import static org.briarproject.android.identity.LocalAuthorItem.NEW; +import static org.briarproject.android.invitation.AddContactActivity.REQUEST_BLUETOOTH; +import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CREATE_IDENTITY; import static org.briarproject.android.util.CommonLayoutParams.MATCH_WRAP; import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP; +import java.util.Collection; + import org.briarproject.R; import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.identity.LocalAuthorItem; +import org.briarproject.android.identity.LocalAuthorItemComparator; import org.briarproject.android.identity.LocalAuthorSpinnerAdapter; +import org.briarproject.api.AuthorId; +import org.briarproject.api.LocalAuthor; import android.content.Context; import android.content.Intent; @@ -53,7 +60,6 @@ implements OnItemSelectedListener, OnClickListener { spinner = new Spinner(ctx); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(this); - container.loadLocalAuthors(adapter); innerLayout.addView(spinner); addView(innerLayout); @@ -68,6 +74,28 @@ implements OnItemSelectedListener, OnClickListener { continueButton.setText(R.string.continue_button); continueButton.setOnClickListener(this); addView(continueButton); + + container.loadLocalAuthors(); + } + + // FIXME: The interaction between views and the container is horrible + void displayLocalAuthors(Collection<LocalAuthor> authors) { + adapter.clear(); + for(LocalAuthor a : authors) adapter.add(new LocalAuthorItem(a)); + adapter.sort(LocalAuthorItemComparator.INSTANCE); + adapter.notifyDataSetChanged(); + // If a local author has been selected, select it again + AuthorId localAuthorId = container.getLocalAuthorId(); + if(localAuthorId == null) return; + int count = adapter.getCount(); + for(int i = 0; i < count; i++) { + LocalAuthorItem item = adapter.getItem(i); + if(item == NEW) continue; + if(item.getLocalAuthor().getId().equals(localAuthorId)) { + spinner.setSelection(i); + return; + } + } } public void onItemSelected(AdapterView<?> parent, View view, int position, @@ -76,7 +104,7 @@ implements OnItemSelectedListener, OnClickListener { if(item == NEW) { container.setLocalAuthorId(null); Intent i = new Intent(container, CreateIdentityActivity.class); - container.startActivity(i); + container.startActivityForResult(i, REQUEST_CREATE_IDENTITY); } else { container.setLocalAuthorId(item.getLocalAuthor().getId()); } @@ -89,6 +117,6 @@ implements OnItemSelectedListener, OnClickListener { public void onClick(View view) { Intent i = new Intent(ACTION_REQUEST_DISCOVERABLE); i.putExtra(EXTRA_DISCOVERABLE_DURATION, 120); - container.startActivityForResult(i, 0); + container.startActivityForResult(i, REQUEST_BLUETOOTH); } }