From c6eb285431e4a8b010b145b4e25a87396eb69157 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 26 Sep 2018 11:56:24 -0300 Subject: [PATCH] Move link input into fragment --- .../android/activity/ActivityComponent.java | 2 + .../contact/ContactLinkInputActivity.java | 112 +++---------- .../contact/ContactLinkInputFragment.java | 149 ++++++++++++++++++ .../contact/ContactLinkOutputActivity.java | 9 +- .../src/main/res/drawable/ic_add_nearby.xml | 9 ++ .../src/main/res/drawable/ic_person_add.xml | 5 + .../src/main/res/drawable/ic_qr_code_scan.xml | 9 ++ ...ut.xml => fragment_contact_link_input.xml} | 0 .../main/res/layout/fragment_contact_list.xml | 3 +- .../main/res/menu/contact_list_actions.xml | 14 +- briar-android/src/main/res/values/strings.xml | 1 + 11 files changed, 209 insertions(+), 104 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkInputFragment.java create mode 100644 briar-android/src/main/res/drawable/ic_add_nearby.xml create mode 100644 briar-android/src/main/res/drawable/ic_person_add.xml create mode 100644 briar-android/src/main/res/drawable/ic_qr_code_scan.xml rename briar-android/src/main/res/layout/{activity_contact_link_input.xml => fragment_contact_link_input.xml} (100%) 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