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 79bca962b..ceaef4a10 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
@@ -16,6 +16,7 @@ import org.briarproject.briar.android.blog.RssFeedImportActivity;
import org.briarproject.briar.android.blog.RssFeedManageActivity;
import org.briarproject.briar.android.blog.WriteBlogPostActivity;
import org.briarproject.briar.android.contact.ContactLinkInputActivity;
+import org.briarproject.briar.android.contact.ContactLinkInputFragment;
import org.briarproject.briar.android.contact.ContactLinkOutputActivity;
import org.briarproject.briar.android.contact.ContactLinkOutputFragment;
import org.briarproject.briar.android.contact.ContactListFragment;
@@ -177,6 +178,7 @@ public interface ActivityComponent {
void inject(PendingRequestsActivity activity);
void inject(ContactLinkOutputFragment activity);
void inject(ContactQrCodeOutputFragment activity);
+ void inject(ContactLinkInputFragment 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 07d021fef..1358a30e6 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
@@ -2,17 +2,11 @@ package org.briarproject.briar.android.contact;
import android.app.AlarmManager;
import android.app.PendingIntent;
-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.util.Log;
import android.view.MenuItem;
-import android.widget.Button;
-import android.widget.EditText;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
@@ -20,7 +14,7 @@ import org.briarproject.bramble.api.system.Clock;
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 org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
import org.briarproject.briar.api.messaging.MessagingManager;
import java.util.Random;
@@ -29,7 +23,6 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import static android.app.AlarmManager.ELAPSED_REALTIME;
-import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN;
import static android.content.Intent.ACTION_SEND;
import static android.content.Intent.ACTION_VIEW;
import static android.content.Intent.EXTRA_TEXT;
@@ -39,8 +32,8 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING;
-public class ContactLinkInputActivity extends BriarActivity
- implements TextWatcher {
+public class ContactLinkInputActivity extends BriarActivity implements
+ BaseFragmentListener {
@Inject
LifecycleManager lifecycleManager;
@@ -49,12 +42,6 @@ public class ContactLinkInputActivity extends BriarActivity
@Inject
Clock clock;
- private ClipboardManager clipboard;
- private EditText linkInput;
- private Button pasteButton;
- private EditText contactNameInput;
- private Button addButton;
-
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
@@ -63,72 +50,38 @@ public class ContactLinkInputActivity extends BriarActivity
@Override
public void onCreate(@Nullable Bundle state) {
super.onCreate(state);
- setContentView(R.layout.activity_contact_link_input);
+ setContentView(R.layout.activity_fragment_container);
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(true);
}
- clipboard = (ClipboardManager) requireNonNull(
- getSystemService(CLIPBOARD_SERVICE));
-
- linkInput = findViewById(R.id.linkInput);
- linkInput.addTextChangedListener(this);
-
- pasteButton = findViewById(R.id.pasteButton);
- pasteButton.setOnClickListener(v -> linkInput
- .setText(clipboard.getPrimaryClip().getItemAt(0).getText()));
-
- contactNameInput = findViewById(R.id.contactNameInput);
- contactNameInput.addTextChangedListener(this);
-
- addButton = findViewById(R.id.addButton);
- addButton.setOnClickListener(v -> onAddButtonClicked());
-
Intent i = getIntent();
if (i != null) {
String action = i.getAction();
if (ACTION_SEND.equals(action) || ACTION_VIEW.equals(action)) {
String text = i.getStringExtra(EXTRA_TEXT);
- if (text != null) linkInput.setText(text);
+ if (text != null) {
+ showInitialFragment(
+ ContactLinkInputFragment.newInstance(text));
+ return;
+ }
String uri = i.getDataString();
- if (uri != null) linkInput.setText(uri);
+ if (uri != null) {
+ showInitialFragment(
+ ContactLinkInputFragment.newInstance(uri));
+ return;
+ }
} else if ("addContact".equals(action)) {
removeFakeRequest(i.getStringExtra("name"),
i.getLongExtra("timestamp", 0));
finish();
}
}
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (hasLinkInClipboard()) pasteButton.setEnabled(true);
- else pasteButton.setEnabled(false);
- }
-
- private boolean hasLinkInClipboard() {
- return clipboard.hasPrimaryClip() &&
- clipboard.getPrimaryClip().getDescription()
- .hasMimeType(MIMETYPE_TEXT_PLAIN) &&
- clipboard.getPrimaryClip().getItemCount() > 0;
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- updateAddButtonState();
- }
-
- @Override
- public void afterTextChanged(Editable s) {
+ if (state == null) {
+ showInitialFragment(ContactLinkInputFragment.newInstance(null));
+ }
}
@Override
@@ -142,36 +95,7 @@ public class ContactLinkInputActivity extends BriarActivity
}
}
- private boolean isBriarLink(CharSequence s) {
- String link = s.toString().trim();
- return link.matches("^(briar://)?[A-Z2-7]{64}$");
- }
-
- private void updateAddButtonState() {
- addButton.setEnabled(isBriarLink(linkInput.getText()) &&
- 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() {
- String name = contactNameInput.getText().toString();
+ void addFakeRequest(String name) {
long timestamp = clock.currentTimeMillis();
try {
messagingManager.addNewPendingContact(name, timestamp);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputFragment.java
new file mode 100644
index 000000000..7be8af67f
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputFragment.java
@@ -0,0 +1,149 @@
+package org.briarproject.briar.android.contact;
+
+import android.content.ClipboardManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+
+import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+import org.briarproject.briar.R;
+import org.briarproject.briar.android.activity.ActivityComponent;
+import org.briarproject.briar.android.fragment.BaseFragment;
+import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
+
+import javax.annotation.Nullable;
+
+import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN;
+import static android.content.Context.CLIPBOARD_SERVICE;
+import static java.util.Objects.requireNonNull;
+
+@NotNullByDefault
+public class ContactLinkInputFragment extends BaseFragment
+ implements TextWatcher {
+
+ private ClipboardManager clipboard;
+ private EditText linkInput;
+ private Button pasteButton;
+ private EditText contactNameInput;
+ private Button addButton;
+
+ static BaseFragment newInstance(@Nullable String link) {
+ BaseFragment f = new ContactLinkInputFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString("link", link);
+ f.setArguments(bundle);
+ return f;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater,
+ @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+
+ getActivity().setTitle(R.string.open_link_title);
+
+ View v = inflater.inflate(R.layout.fragment_contact_link_input,
+ container, false);
+
+ clipboard = (ClipboardManager) requireNonNull(
+ getContext().getSystemService(CLIPBOARD_SERVICE));
+
+ linkInput = v.findViewById(R.id.linkInput);
+ linkInput.addTextChangedListener(this);
+
+ pasteButton = v.findViewById(R.id.pasteButton);
+ pasteButton.setOnClickListener(view -> linkInput
+ .setText(clipboard.getPrimaryClip().getItemAt(0).getText()));
+
+ contactNameInput = v.findViewById(R.id.contactNameInput);
+ contactNameInput.addTextChangedListener(this);
+
+ addButton = v.findViewById(R.id.addButton);
+ addButton.setOnClickListener(view -> onAddButtonClicked());
+
+ linkInput.setText(getArguments().getString("link"));
+
+ return v;
+ }
+
+ public static final String TAG = ContactLinkInputFragment.class.getName();
+
+ @Override
+ public String getUniqueTag() {
+ return TAG;
+ }
+
+ @Override
+ public void injectFragment(ActivityComponent component) {
+ component.inject(this);
+ }
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (hasLinkInClipboard()) pasteButton.setEnabled(true);
+ else pasteButton.setEnabled(false);
+ }
+
+ private boolean hasLinkInClipboard() {
+ return clipboard.hasPrimaryClip() &&
+ clipboard.getPrimaryClip().getDescription()
+ .hasMimeType(MIMETYPE_TEXT_PLAIN) &&
+ clipboard.getPrimaryClip().getItemCount() > 0;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ updateAddButtonState();
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+
+ private boolean isBriarLink(CharSequence s) {
+ String link = s.toString().trim();
+ return link.matches("^(briar://)?[A-Z2-7]{64}$");
+ }
+
+ private void updateAddButtonState() {
+ addButton.setEnabled(isBriarLink(linkInput.getText()) &&
+ contactNameInput.getText().length() > 0);
+ }
+
+ private void onAddButtonClicked() {
+ if (getActivity() == null || getContext() == null) return;;
+
+ ((ContactLinkInputActivity) getActivity())
+ .addFakeRequest(contactNameInput.getText().toString());
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.BriarDialogTheme_Neutral);
+ builder.setMessage(getString(R.string.add_contact_link_question));
+ builder.setPositiveButton(R.string.yes, (dialog, which) -> {
+ startActivity(new Intent(getContext(), NavDrawerActivity.class));
+ finish();
+ });
+ builder.setNegativeButton(R.string.no, (dialog, which) -> {
+ startActivity(
+ new Intent(getContext(), ContactLinkOutputActivity.class));
+ finish();
+ });
+ builder.show();
+ }
+
+
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkOutputActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkOutputActivity.java
index 87b594e03..f7c920983 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkOutputActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkOutputActivity.java
@@ -3,7 +3,6 @@ package org.briarproject.briar.android.contact;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import org.briarproject.briar.R;
@@ -42,10 +41,10 @@ public class ContactLinkOutputActivity extends BriarActivity implements
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.contact_output_actions, menu);
- menu.findItem(R.id.action_switch)
- .setTitle(showQrCode ? R.string.show_link : R.string.show_code);
+// MenuInflater inflater = getMenuInflater();
+// inflater.inflate(R.menu.contact_output_actions, menu);
+// menu.findItem(R.id.action_switch)
+// .setTitle(showQrCode ? R.string.show_link : R.string.show_code);
return super.onCreateOptionsMenu(menu);
}
diff --git a/briar-android/src/main/res/drawable/ic_add_nearby.xml b/briar-android/src/main/res/drawable/ic_add_nearby.xml
new file mode 100644
index 000000000..71b51dc2b
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_add_nearby.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/briar-android/src/main/res/drawable/ic_person_add.xml b/briar-android/src/main/res/drawable/ic_person_add.xml
new file mode 100644
index 000000000..c273ca40b
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_person_add.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/briar-android/src/main/res/drawable/ic_qr_code_scan.xml b/briar-android/src/main/res/drawable/ic_qr_code_scan.xml
new file mode 100644
index 000000000..5f1609f88
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_qr_code_scan.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/briar-android/src/main/res/layout/activity_contact_link_input.xml b/briar-android/src/main/res/layout/fragment_contact_link_input.xml
similarity index 100%
rename from briar-android/src/main/res/layout/activity_contact_link_input.xml
rename to briar-android/src/main/res/layout/fragment_contact_link_input.xml
diff --git a/briar-android/src/main/res/layout/fragment_contact_list.xml b/briar-android/src/main/res/layout/fragment_contact_list.xml
index 926d22279..68fa4955e 100644
--- a/briar-android/src/main/res/layout/fragment_contact_list.xml
+++ b/briar-android/src/main/res/layout/fragment_contact_list.xml
@@ -21,7 +21,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
- app:sdMainFabClosedSrc="@drawable/ic_add_white"
+ app:sdMainFabClosedSrc="@drawable/ic_person_add"
+ app:sdMainFabOpenedSrc="@drawable/ic_close"
app:sdOverlayLayout="@id/overlay"/>
diff --git a/briar-android/src/main/res/menu/contact_list_actions.xml b/briar-android/src/main/res/menu/contact_list_actions.xml
index 9940051e4..f6be093aa 100644
--- a/briar-android/src/main/res/menu/contact_list_actions.xml
+++ b/briar-android/src/main/res/menu/contact_list_actions.xml
@@ -5,22 +5,28 @@
-
+
+ -->
+
+
- Add Contact Nearby
Open Link
+ Open QR Code
Send My Link
Send My QR Code
Show Link