From ace2ea3c5bbd37c583d362a4da2f884207ff11d9 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 25 Sep 2018 11:08:08 -0300 Subject: [PATCH] Add pending contact requests screen --- briar-android/src/main/AndroidManifest.xml | 5 ++ .../android/activity/ActivityComponent.java | 2 + .../contact/ContactLinkInputActivity.java | 30 ++++++++-- .../android/contact/ContactListFragment.java | 7 +-- .../contact/PendingRequestsActivity.java | 55 +++++++++++++++++++ .../contact/PendingRequestsAdapter.java | 55 +++++++++++++++++++ .../android/contact/PendingRequestsItem.java | 27 +++++++++ .../contact/PendingRequestsViewHolder.java | 29 ++++++++++ .../res/layout/list_item_pending_contact.xml | 46 ++++++++++++++++ briar-android/src/main/res/values/strings.xml | 5 ++ 10 files changed, 252 insertions(+), 9 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsAdapter.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsItem.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java create mode 100644 briar-android/src/main/res/layout/list_item_pending_contact.xml diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index 22858f843..283a67024 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -445,5 +445,10 @@ + + diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java index 064c8d13a..13dc94b31 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java @@ -19,6 +19,7 @@ import org.briarproject.briar.android.contact.ContactLinkInputActivity; import org.briarproject.briar.android.contact.ContactLinkOutputActivity; import org.briarproject.briar.android.contact.ContactListFragment; import org.briarproject.briar.android.contact.ContactModule; +import org.briarproject.briar.android.contact.PendingRequestsActivity; import org.briarproject.briar.android.conversation.AliasDialogFragment; import org.briarproject.briar.android.conversation.ConversationActivity; import org.briarproject.briar.android.conversation.ImageActivity; @@ -175,6 +176,7 @@ public interface ActivityComponent { void inject(ContactLinkOutputActivity activity); void inject(ContactLinkInputActivity activity); + void inject(PendingRequestsActivity activity); // Fragments void inject(AuthorNameFragment fragment); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputActivity.java index 79c5aa5da..72d9932b7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputActivity.java @@ -4,23 +4,23 @@ import android.content.ClipboardManager; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog.Builder; import android.text.Editable; import android.text.TextWatcher; import android.view.MenuItem; import android.widget.Button; import android.widget.EditText; -import android.widget.Toast; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; +import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import javax.annotation.Nullable; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; import static android.content.Intent.ACTION_SEND; import static android.content.Intent.EXTRA_TEXT; -import static android.widget.Toast.LENGTH_SHORT; import static java.util.Objects.requireNonNull; public class ContactLinkInputActivity extends BriarActivity @@ -61,9 +61,7 @@ public class ContactLinkInputActivity extends BriarActivity contactNameInput.addTextChangedListener(this); addButton = findViewById(R.id.addButton); - addButton.setOnClickListener(v -> Toast.makeText(this, - "Contact " + contactNameInput.getText() + " requested", - LENGTH_SHORT).show()); + addButton.setOnClickListener(v -> onAddButtonClicked()); Intent i = getIntent(); if (i != null && ACTION_SEND.equals(i.getAction())) { @@ -122,4 +120,26 @@ public class ContactLinkInputActivity extends BriarActivity contactNameInput.getText().length() > 0); } + private void onAddButtonClicked() { + addFakeRequest(); + + Builder builder = new Builder(this, R.style.BriarDialogTheme_Neutral); + builder.setMessage(getString(R.string.add_contact_link_question)); + builder.setPositiveButton(R.string.yes, (dialog, which) -> { + startActivity(new Intent(ContactLinkInputActivity.this, + NavDrawerActivity.class)); + finish(); + }); + builder.setNegativeButton(R.string.no, (dialog, which) -> { + startActivity(new Intent(ContactLinkInputActivity.this, + ContactLinkOutputActivity.class)); + finish(); + }); + builder.show(); + } + + private void addFakeRequest() { + // TODO + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java index dc521ffa8..b93ade598 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java @@ -156,12 +156,11 @@ public class ContactListFragment extends BaseFragment implements EventListener, list.setEmptyText(getString(R.string.no_contacts)); list.setEmptyAction(getString(R.string.no_contacts_action)); - snackbar = - Snackbar.make(contentView, "There are pending contact requests", - LENGTH_INDEFINITE); + snackbar = Snackbar.make(contentView, + R.string.pending_contact_requests_snackbar, LENGTH_INDEFINITE); snackbar.getView().setBackgroundResource(R.color.briar_primary); snackbar.setAction(R.string.show, v -> startActivity( - new Intent(getContext(), ContactLinkInputActivity.class))); + new Intent(getContext(), PendingRequestsActivity.class))); snackbar.setActionTextColor(ContextCompat .getColor(getContext(), R.color.briar_button_text_positive)); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java new file mode 100644 index 000000000..8c3b64850 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsActivity.java @@ -0,0 +1,55 @@ +package org.briarproject.briar.android.contact; + +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.LinearLayoutManager; +import android.view.MenuItem; + +import org.briarproject.briar.R; +import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.activity.BriarActivity; +import org.briarproject.briar.android.view.BriarRecyclerView; + +import javax.annotation.Nullable; + +public class PendingRequestsActivity extends BriarActivity { + + private PendingRequestsAdapter adapter; + private BriarRecyclerView list; + + @Override + public void injectActivity(ActivityComponent component) { + component.inject(this); + } + + @Override + public void onCreate(@Nullable Bundle state) { + super.onCreate(state); + + setContentView(R.layout.list); + + ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); + } + + adapter = new PendingRequestsAdapter(this, PendingRequestsItem.class); + list = findViewById(R.id.list); + list.setLayoutManager(new LinearLayoutManager(this)); + list.setAdapter(adapter); + + adapter.add(new PendingRequestsItem("test", System.currentTimeMillis() - 50000)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsAdapter.java new file mode 100644 index 000000000..c9ba088e6 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsAdapter.java @@ -0,0 +1,55 @@ +package org.briarproject.briar.android.contact; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.R; +import org.briarproject.briar.android.util.BriarAdapter; + +@NotNullByDefault +public class PendingRequestsAdapter extends + BriarAdapter { + + public PendingRequestsAdapter(Context ctx, Class c) { + super(ctx, c); + } + + @NonNull + @Override + public PendingRequestsViewHolder onCreateViewHolder( + ViewGroup viewGroup, int i) { + View v = LayoutInflater.from(viewGroup.getContext()).inflate( + R.layout.list_item_pending_contact, viewGroup, false); + return new PendingRequestsViewHolder(v); + } + + @Override + public void onBindViewHolder( + PendingRequestsViewHolder pendingRequestsViewHolder, int i) { + pendingRequestsViewHolder.bind(items.get(i)); + } + + @Override + public int compare(PendingRequestsItem item1, PendingRequestsItem item2) { + return (int) (item1.getTimestamp() - item2.getTimestamp()); + } + + @Override + public boolean areContentsTheSame(PendingRequestsItem item1, + PendingRequestsItem item2) { + return item1.getName().equals(item2.getName()) && + item1.getTimestamp() == item2.getTimestamp(); + } + + @Override + public boolean areItemsTheSame(PendingRequestsItem item1, + PendingRequestsItem item2) { + return item1.getName().equals(item2.getName()) && + item1.getTimestamp() == item2.getTimestamp(); + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsItem.java new file mode 100644 index 000000000..f75b38ef9 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsItem.java @@ -0,0 +1,27 @@ +package org.briarproject.briar.android.contact; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class PendingRequestsItem { + + private final String name; + private final long timestamp; + + public PendingRequestsItem(String name, long timestamp) { + this.name = name; + this.timestamp = timestamp; + } + + public String getName() { + return name; + } + + public long getTimestamp() { + return timestamp; + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java new file mode 100644 index 000000000..e83104181 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/PendingRequestsViewHolder.java @@ -0,0 +1,29 @@ +package org.briarproject.briar.android.contact; + +import android.support.v7.widget.RecyclerView.ViewHolder; +import android.view.View; +import android.widget.TextView; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.R; + +import static org.briarproject.briar.android.util.UiUtils.formatDate; + +@NotNullByDefault +public class PendingRequestsViewHolder extends ViewHolder { + + private final TextView name; + private final TextView time; + + public PendingRequestsViewHolder(View v) { + super(v); + name = v.findViewById(R.id.name); + time = v.findViewById(R.id.time); + } + + public void bind(PendingRequestsItem item) { + name.setText(item.getName()); + time.setText(formatDate(time.getContext(), item.getTimestamp())); + } + +} diff --git a/briar-android/src/main/res/layout/list_item_pending_contact.xml b/briar-android/src/main/res/layout/list_item_pending_contact.xml new file mode 100644 index 000000000..76243d4c9 --- /dev/null +++ b/briar-android/src/main/res/layout/list_item_pending_contact.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 00e5c852d..f268d802c 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -176,6 +176,11 @@ Send this link to your contact: Briar link Link copied + "There are pending contact requests" + Pending contact requests + Did you send your link already? + Yes + No Introduce your contacts