diff --git a/app/src/main/java/eu/faircode/email/FragmentAnswer.java b/app/src/main/java/eu/faircode/email/FragmentAnswer.java index 80fa24db62..253cca205d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAnswer.java +++ b/app/src/main/java/eu/faircode/email/FragmentAnswer.java @@ -20,8 +20,10 @@ package eu.faircode.email; */ import android.app.Dialog; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.text.Spanned; import android.view.LayoutInflater; @@ -46,8 +48,9 @@ public class FragmentAnswer extends FragmentBase { private ViewGroup view; private EditText etName; private CheckBox cbHide; - private EditText etText; + private EditTextCompose etText; private ImageButton ibInfo; + private BottomNavigationView style_bar; private BottomNavigationView bottom_navigation; private ContentLoadingProgressBar pbWait; private Group grpReady; @@ -55,7 +58,8 @@ public class FragmentAnswer extends FragmentBase { private long id = -1; private long copy = -1; - private final static int REQUEST_DELETE = 1; + private static final int REQUEST_LINK = 1; + private final static int REQUEST_DELETE = 2; @Override public void onCreate(Bundle savedInstanceState) { @@ -83,11 +87,19 @@ public class FragmentAnswer extends FragmentBase { etText = view.findViewById(R.id.etText); ibInfo = view.findViewById(R.id.ibInfo); + style_bar = view.findViewById(R.id.style_bar); bottom_navigation = view.findViewById(R.id.bottom_navigation); pbWait = view.findViewById(R.id.pbWait); grpReady = view.findViewById(R.id.grpReady); + etText.setSelectionListener(new EditTextCompose.ISelection() { + @Override + public void onSelected(boolean selection) { + style_bar.setVisibility(selection ? View.VISIBLE : View.GONE); + } + }); + ibInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -95,6 +107,13 @@ public class FragmentAnswer extends FragmentBase { } }); + style_bar.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + return onActionStyle(item.getItemId()); + } + }); + bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { @@ -113,6 +132,7 @@ public class FragmentAnswer extends FragmentBase { // Initialize grpReady.setVisibility(View.GONE); + style_bar.setVisibility(View.GONE); pbWait.setVisibility(View.VISIBLE); return view; @@ -223,6 +243,10 @@ public class FragmentAnswer extends FragmentBase { try { switch (requestCode) { + case REQUEST_LINK: + if (resultCode == RESULT_OK && data != null) + onLinkSelected(data.getBundleExtra("args")); + break; case REQUEST_DELETE: if (resultCode == RESULT_OK) onDelete(); @@ -233,6 +257,11 @@ public class FragmentAnswer extends FragmentBase { } } + private void onLinkSelected(Bundle args) { + String link = args.getString("link"); + StyleHelper.apply(R.id.menu_link, etText, link); + } + private void onDelete() { Bundle args = new Bundle(); args.putLong("id", id); @@ -267,6 +296,33 @@ public class FragmentAnswer extends FragmentBase { }.execute(this, args, "answer:delete"); } + private boolean onActionStyle(int action) { + Log.i("Style action=" + action); + + if (action == R.id.menu_link) { + Uri uri = null; + + ClipboardManager cbm = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + if (cbm.hasPrimaryClip()) { + String link = cbm.getPrimaryClip().getItemAt(0).coerceToText(getContext()).toString(); + uri = Uri.parse(link); + if (uri.getScheme() == null) + uri = null; + } + + Bundle args = new Bundle(); + args.putParcelable("uri", uri); + + FragmentDialogLink fragment = new FragmentDialogLink(); + fragment.setArguments(args); + fragment.setTargetFragment(this, REQUEST_LINK); + fragment.show(getFragmentManager(), "compose:link"); + + return true; + } else + return StyleHelper.apply(action, etText); + } + public static class FragmentInfo extends FragmentDialogBase { @NonNull @Override diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index fcb45894c5..ec45ec42ef 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -58,13 +58,11 @@ import android.os.Looper; import android.provider.ContactsContract; import android.provider.MediaStore; import android.provider.OpenableColumns; -import android.text.Editable; import android.text.Html; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; -import android.text.TextWatcher; import android.text.style.ImageSpan; import android.text.style.QuoteSpan; import android.util.DisplayMetrics; @@ -3430,61 +3428,6 @@ public class FragmentCompose extends FragmentBase { } } - public static class FragmentDialogLink extends FragmentDialogBase { - private EditText etLink; - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - outState.putString("fair:link", etLink.getText().toString()); - super.onSaveInstanceState(outState); - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - Uri uri = getArguments().getParcelable("uri"); - - View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_insert_link, null); - etLink = view.findViewById(R.id.etLink); - final TextView tvInsecure = view.findViewById(R.id.tvInsecure); - - etLink.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable editable) { - Uri uri = Uri.parse(editable.toString()); - tvInsecure.setVisibility(!uri.isOpaque() && - "http".equals(uri.getScheme()) ? View.VISIBLE : View.GONE); - } - }); - - if (savedInstanceState == null) - etLink.setText(uri == null ? "https://" : uri.toString()); - else - etLink.setText(savedInstanceState.getString("fair:link")); - - return new AlertDialog.Builder(getContext()) - .setView(view) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String link = etLink.getText().toString(); - getArguments().putString("link", link); - sendResult(RESULT_OK); - } - }) - .setNegativeButton(android.R.string.cancel, null) - .create(); - } - } - public static class FragmentDialogSend extends FragmentDialogBase { @NonNull @Override diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogLink.java b/app/src/main/java/eu/faircode/email/FragmentDialogLink.java new file mode 100644 index 0000000000..f24e7b9e16 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/FragmentDialogLink.java @@ -0,0 +1,73 @@ +package eu.faircode.email; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.net.Uri; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; + +import static android.app.Activity.RESULT_OK; + +public class FragmentDialogLink extends FragmentDialogBase { + private EditText etLink; + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + outState.putString("fair:link", etLink.getText().toString()); + super.onSaveInstanceState(outState); + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + Uri uri = getArguments().getParcelable("uri"); + + View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_insert_link, null); + etLink = view.findViewById(R.id.etLink); + final TextView tvInsecure = view.findViewById(R.id.tvInsecure); + + etLink.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable editable) { + Uri uri = Uri.parse(editable.toString()); + tvInsecure.setVisibility(!uri.isOpaque() && + "http".equals(uri.getScheme()) ? View.VISIBLE : View.GONE); + } + }); + + if (savedInstanceState == null) + etLink.setText(uri == null ? "https://" : uri.toString()); + else + etLink.setText(savedInstanceState.getString("fair:link")); + + return new AlertDialog.Builder(getContext()) + .setView(view) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String link = etLink.getText().toString(); + getArguments().putString("link", link); + sendResult(RESULT_OK); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .create(); + } +} diff --git a/app/src/main/res/layout/fragment_answer.xml b/app/src/main/res/layout/fragment_answer.xml index ef72c0d258..29c577725f 100644 --- a/app/src/main/res/layout/fragment_answer.xml +++ b/app/src/main/res/layout/fragment_answer.xml @@ -41,7 +41,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/cbHide" /> - @@ -69,6 +69,19 @@ app:layout_constraintEnd_toEndOf="@id/etText" app:srcCompat="@drawable/baseline_info_24" /> + + + + + + + + + + + + +