diff --git a/briar-android/artwork/ic_nearby.svg b/briar-android/artwork/ic_nearby.svg index 4acef5fdb..b25e40dee 100644 --- a/briar-android/artwork/ic_nearby.svg +++ b/briar-android/artwork/ic_nearby.svg @@ -7,20 +7,29 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - x="0px" - y="0px" - viewBox="0 0 24 24" - xml:space="preserve" - id="svg22" - sodipodi:docname="ic_nearby.svg" width="24" height="24" - inkscape:version="0.92.3 (2405546, 2018-03-11)">image/svg+xml + + + + image/svg+xml + + + + + + + \ No newline at end of file + inkscape:current-layer="svg12" /> + + diff --git a/briar-android/artwork/nickname.svg b/briar-android/artwork/nickname.svg new file mode 100644 index 000000000..7daecca04 --- /dev/null +++ b/briar-android/artwork/nickname.svg @@ -0,0 +1,176 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 0af3d5b9a..5a9a1ad3d 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.ContactLinkExchangeActivity; import org.briarproject.briar.android.contact.ContactLinkExchangeFragment; import org.briarproject.briar.android.contact.ContactListFragment; import org.briarproject.briar.android.contact.ContactModule; +import org.briarproject.briar.android.contact.ContactNicknameFragment; import org.briarproject.briar.android.contact.ContactQrCodeInputFragment; import org.briarproject.briar.android.contact.ContactQrCodeOutputFragment; import org.briarproject.briar.android.contact.PendingRequestsActivity; @@ -229,6 +230,8 @@ public interface ActivityComponent { void inject(ContactLinkExchangeFragment fragment); + void inject(ContactNicknameFragment fragment); + void inject(ContactQrCodeOutputFragment fragment); void inject(ContactQrCodeInputFragment fragment); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java index 3e29914db..d5003c297 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactLinkExchangeFragment.java @@ -2,13 +2,13 @@ package org.briarproject.briar.android.contact; import android.content.ClipData; import android.content.ClipboardManager; -import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.support.v4.app.ShareCompat.IntentBuilder; +import android.support.v7.widget.AppCompatImageButton; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,9 +47,8 @@ public class ContactLinkExchangeFragment extends BaseFragment { } private ClipboardManager clipboard; - private TextInputLayout linkInputLayout, contactNameLayout; - private TextInputEditText linkInput, contactNameInput; - private Button addButton; + private TextInputLayout linkInputLayout; + private TextInputEditText linkInput; @Override public String getUniqueTag() { @@ -68,7 +67,7 @@ public class ContactLinkExchangeFragment extends BaseFragment { @Nullable Bundle savedInstanceState) { if (getActivity() == null || getContext() == null) return null; - getActivity().setTitle(R.string.add_contact_title); + getActivity().setTitle(R.string.add_contact_remotely_title_case); View v = inflater.inflate(R.layout.fragment_contact_link_exchange, container, false); @@ -79,16 +78,8 @@ public class ContactLinkExchangeFragment extends BaseFragment { int color = resolveColorAttribute(getContext(), R.attr.colorControlNormal); - addButton = v.findViewById(R.id.addButton); - addButton.setOnClickListener(view -> onAddButtonClicked()); - - contactNameLayout = v.findViewById(R.id.contactNameLayout); - contactNameInput = v.findViewById(R.id.contactNameInput); - if (SDK_INT < 23) { - Drawable drawable = wrap(contactNameInput.getCompoundDrawables()[0]); - setTint(drawable, color); - contactNameInput.setCompoundDrawables(drawable, null, null, null); - } + Button continueButton = v.findViewById(R.id.addButton); + continueButton.setOnClickListener(view -> onContinueButtonClicked()); linkInputLayout = v.findViewById(R.id.linkInputLayout); linkInput = v.findViewById(R.id.linkInput); @@ -100,7 +91,7 @@ public class ContactLinkExchangeFragment extends BaseFragment { if (getArguments() != null) linkInput.setText(getArguments().getString("link")); - Button pasteButton = v.findViewById(R.id.pasteButton); + AppCompatImageButton pasteButton = v.findViewById(R.id.pasteButton); pasteButton.setOnClickListener(view -> { ClipData clip = clipboard.getPrimaryClip(); if (clip != null) @@ -162,13 +153,6 @@ public class ContactLinkExchangeFragment extends BaseFragment { linkInput.requestFocus(); return true; } else linkInputLayout.setError(null); - boolean validContactName = contactNameInput.getText() != null && - contactNameInput.getText().length() > 0; - if (!validContactName) { - contactNameLayout.setError(getString(R.string.nickname_missing)); - contactNameInput.requestFocus(); - return true; - } else contactNameLayout.setError(null); return false; } @@ -186,17 +170,15 @@ public class ContactLinkExchangeFragment extends BaseFragment { return null; } - private void onAddButtonClicked() { + private void onContinueButtonClicked() { ContactLinkExchangeActivity activity = getCastActivity(); if (activity == null || isInputError()) return; String linkText = getLink(); if (linkText == null) throw new AssertionError(); - activity.addFakeRequest(contactNameInput.getText().toString(), - linkText); - Intent intent = new Intent(activity, PendingRequestsActivity.class); - startActivity(intent); - finish(); + BaseFragment f = ContactNicknameFragment.newInstance(linkText); + activity.showNextFragment(f); } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactNicknameFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactNicknameFragment.java new file mode 100644 index 000000000..4a142508d --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactNicknameFragment.java @@ -0,0 +1,120 @@ +package org.briarproject.briar.android.contact; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.MainThread; +import android.support.annotation.NonNull; +import android.support.annotation.UiThread; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import org.briarproject.briar.R; +import org.briarproject.briar.android.activity.ActivityComponent; +import org.briarproject.briar.android.fragment.BaseFragment; + +import javax.annotation.Nullable; + +import static android.os.Build.VERSION.SDK_INT; +import static android.support.v4.graphics.drawable.DrawableCompat.setTint; +import static android.support.v4.graphics.drawable.DrawableCompat.wrap; +import static java.util.Objects.requireNonNull; +import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute; + +public class ContactNicknameFragment extends BaseFragment { + + static final String TAG = ContactNicknameFragment.class.getName(); + + static BaseFragment newInstance(@Nullable String link) { + BaseFragment f = new ContactNicknameFragment(); + Bundle bundle = new Bundle(); + bundle.putString("link", link); + f.setArguments(bundle); + return f; + } + + private TextInputLayout contactNameLayout; + private TextInputEditText contactNameInput; + + @Nullable + private String link; + + @Override + public String getUniqueTag() { + return TAG; + } + + @Override + public void injectFragment(ActivityComponent component) { + component.inject(this); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + if (getActivity() == null || getContext() == null) return null; + + getActivity().setTitle(R.string.add_contact_remotely_title_case); + + link = requireNonNull(getArguments()).getString("link"); + Log.e(TAG, link); + + View v = inflater.inflate(R.layout.fragment_contact_choose_nickname, + container, false); + + int color = + resolveColorAttribute(getContext(), R.attr.colorControlNormal); + + Button addButton = v.findViewById(R.id.addButton); + addButton.setOnClickListener(view -> onAddButtonClicked()); + + contactNameLayout = v.findViewById(R.id.contactNameLayout); + contactNameInput = v.findViewById(R.id.contactNameInput); + if (SDK_INT < 23) { + Drawable drawable = wrap(contactNameInput.getCompoundDrawables()[0]); + setTint(drawable, color); + contactNameInput.setCompoundDrawables(drawable, null, null, null); + } + + return v; + } + + private ContactLinkExchangeActivity getCastActivity() { + return (ContactLinkExchangeActivity) getActivity(); + } + + @MainThread + @UiThread + private boolean isInputError() { + boolean validContactName = contactNameInput.getText() != null && + contactNameInput.getText().toString().trim().length() > 0; + if (!validContactName) { + contactNameLayout.setError(getString(R.string.nickname_missing)); + contactNameInput.requestFocus(); + return true; + } else contactNameLayout.setError(null); + return false; + } + + private void onAddButtonClicked() { + ContactLinkExchangeActivity activity = getCastActivity(); + if (activity == null || isInputError()) return; + + String name = requireNonNull(contactNameInput.getText()).toString(); + if (link == null) throw new AssertionError(); + + activity.addFakeRequest(name, link); + + Intent intent = new Intent(activity, PendingRequestsActivity.class); + startActivity(intent); + finish(); + } + +} 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 index 29cd66a6f..0df247012 100644 --- 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 @@ -1,5 +1,6 @@ package org.briarproject.briar.android.contact; +import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView.ViewHolder; import android.util.Log; import android.view.View; @@ -37,13 +38,18 @@ public class PendingRequestsViewHolder extends ViewHolder { time.setText(formatDate(time.getContext(), item.getTimestamp())); long diff = item.getAddAt() - System.currentTimeMillis(); Log.e("TEST", "diff: " + diff); + int color = ContextCompat + .getColor(status.getContext(), R.color.briar_green); if (diff < SECONDS.toMillis(10)) { status.setText(R.string.adding_contact); } else if (diff < SECONDS.toMillis(20)) { status.setText(R.string.connecting); } else if (diff < SECONDS.toMillis(30)) { status.setText(R.string.waiting_for_contact_to_come_online); + color = ContextCompat + .getColor(status.getContext(), R.color.briar_yellow); } + status.setTextColor(color); } } diff --git a/briar-android/src/main/res/drawable/bubble_accent.xml b/briar-android/src/main/res/drawable/bubble_accent.xml new file mode 100644 index 000000000..959efaa82 --- /dev/null +++ b/briar-android/src/main/res/drawable/bubble_accent.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/briar-android/src/main/res/drawable/ic_call_made.xml b/briar-android/src/main/res/drawable/ic_call_made.xml new file mode 100644 index 000000000..1c2334060 --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_call_made.xml @@ -0,0 +1,9 @@ + + + diff --git a/briar-android/src/main/res/drawable/ic_call_received.xml b/briar-android/src/main/res/drawable/ic_call_received.xml new file mode 100644 index 000000000..7528c847b --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_call_received.xml @@ -0,0 +1,10 @@ + + + diff --git a/briar-android/src/main/res/drawable/ic_nearby.xml b/briar-android/src/main/res/drawable/ic_nearby.xml index 3ca6c177b..9e16444a3 100644 --- a/briar-android/src/main/res/drawable/ic_nearby.xml +++ b/briar-android/src/main/res/drawable/ic_nearby.xml @@ -4,6 +4,6 @@ android:viewportHeight="24" android:viewportWidth="24"> + android:fillColor="#FFFFFFFF" + android:pathData="M11.1731,2.4031C9.9686,2.4471 8.7753,2.713 7.6641,3.2033 8.187,3.7263 8.3967,4.1446 8.6059,4.563 11.6391,3.4125 15.0914,4.0394 17.4971,6.445c0.7322,0.7321 1.3593,1.5692 1.6731,2.5105 0.4184,-0.2092 0.9412,-0.3134 1.4642,-0.3134h0.1045C20.2158,7.387 19.483,6.3401 18.5416,5.2942 16.5283,3.2808 13.823,2.3062 11.1731,2.4031ZM5.1695,3.2316A2.7194,2.7194 0,0 0,2.4501 5.951,2.7194 2.7194,0 0,0 5.1695,8.6704 2.7194,2.7194 0,0 0,7.8889 5.951,2.7194 2.7194,0 0,0 5.1695,3.2316ZM2.5404,8.5359C0.9715,12.1966 1.7027,16.4848 4.6313,19.4134c1.8827,1.9872 4.4972,2.9301 7.0074,2.9301 2.5102,0 5.1264,-0.9428 7.0092,-2.9301 0.9413,-0.9414 1.6724,-2.091 2.1953,-3.3461h-0.1045c-0.5229,0 -1.0458,-0.1042 -1.4642,-0.3134 -0.4184,0.9414 -0.9409,1.7783 -1.6731,2.5105 -3.2423,3.2424 -8.5771,3.2424 -11.8194,0C3.2719,15.8588 2.6451,12.4064 3.7957,9.3733 3.3773,9.1641 2.9588,8.9542 2.5404,8.5359ZM11.5944,9.3804a2.9913,2.9913 0,0 0,-2.9903 2.9903,2.9913 2.9913,0 0,0 2.9903,2.992 2.9913,2.9913 0,0 0,2.992 -2.992,2.9913 2.9913,0 0,0 -2.992,-2.9903zM20.7334,9.8035a2.7194,2.7194 0,0 0,-2.7194 2.7194,2.7194 2.7194,0 0,0 2.7194,2.7194 2.7194,2.7194 0,0 0,2.7194 -2.7194,2.7194 2.7194,0 0,0 -2.7194,-2.7194z"/> diff --git a/briar-android/src/main/res/drawable/ic_nickname.xml b/briar-android/src/main/res/drawable/ic_nickname.xml new file mode 100644 index 000000000..f7e69d377 --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_nickname.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + diff --git a/briar-android/src/main/res/layout/fragment_contact_choose_nickname.xml b/briar-android/src/main/res/layout/fragment_contact_choose_nickname.xml new file mode 100644 index 000000000..cd21c2a3d --- /dev/null +++ b/briar-android/src/main/res/layout/fragment_contact_choose_nickname.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +