@ -55,6 +55,7 @@ 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.text.style.StyleSpan ;
@ -770,31 +771,44 @@ public class FragmentCompose extends FragmentBase {
}
private void onMenuStyle ( int id ) {
int start = etBody . getSelectionStart ( ) ;
int end = etBody . getSelectionEnd ( ) ;
if ( start > end ) {
int tmp = start ;
start = end ;
end = tmp ;
int s = etBody . getSelectionStart ( ) ;
int e = etBody . getSelectionEnd ( ) ;
if ( s < 0 )
s = 0 ;
if ( e < 0 )
e = 0 ;
if ( s > e ) {
int tmp = s ;
s = e ;
e = tmp ;
}
if ( start = = end )
Snackbar . make ( view , R . string . title_no_selection , Snackbar . LENGTH_LONG ) . show ( ) ;
else {
final SpannableString s = new SpannableString ( etBody . getText ( ) ) ;
final int start = s ;
final int end = e ;
final SpannableString ss = new SpannableString ( etBody . getText ( ) ) ;
switch ( id ) {
case R . id . menu_bold :
s . setSpan ( new StyleSpan ( Typeface . BOLD ) , start , end , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
if ( start = = end )
Snackbar . make ( view , R . string . title_no_selection , Snackbar . LENGTH_LONG ) . show ( ) ;
else
ss . setSpan ( new StyleSpan ( Typeface . BOLD ) , start , end , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
break ;
case R . id . menu_italic :
s . setSpan ( new StyleSpan ( Typeface . ITALIC ) , start , end , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
if ( start = = end )
Snackbar . make ( view , R . string . title_no_selection , Snackbar . LENGTH_LONG ) . show ( ) ;
else
ss . setSpan ( new StyleSpan ( Typeface . ITALIC ) , start , end , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
break ;
case R . id . menu_clear :
for ( Object span : s . getSpans ( start , end , Object . class ) )
for ( Object span : s s. getSpans ( 0 , ss . length ( ) , Object . class ) )
if ( ! ( span instanceof ImageSpan ) )
s. removeSpan ( span ) ;
s s. removeSpan ( span ) ;
break ;
case R . id . menu_link :
@ -809,18 +823,35 @@ public class FragmentCompose extends FragmentBase {
}
View view = LayoutInflater . from ( getContext ( ) ) . inflate ( R . layout . dialog_link , null ) ;
final int fStart = start ;
final int fEnd = end ;
final EditText etLink = view . findViewById ( R . id . etLink ) ;
final TextView tvInsecure = view . findViewById ( R . id . tvInsecure ) ;
etLink . setText ( uri = = null ? "https://" : uri . toString ( ) ) ;
tvInsecure . setVisibility ( View . GONE ) ;
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 ) {
tvInsecure . setVisibility ( "http" . equals ( Uri . parse ( s . toString ( ) ) . getScheme ( ) ) ? View . VISIBLE : View . GONE ) ;
}
@Override
public void afterTextChanged ( Editable s ) {
}
} ) ;
new DialogBuilderLifecycle ( getContext ( ) , getViewLifecycleOwner ( ) )
. setView ( view )
. setPositiveButton ( android . R . string . ok , new DialogInterface . OnClickListener ( ) {
@Override
public void onClick ( DialogInterface dialog , int which ) {
s . setSpan ( new URLSpan ( etLink . getText ( ) . toString ( ) ) , fStart , fEnd , Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
etBody . setText ( s ) ;
etBody . setSelection ( fEnd ) ;
s s. setSpan ( new URLSpan ( etLink . getText ( ) . toString ( ) ) , start, e nd, Spanned . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
etBody . setText ( s s) ;
etBody . setSelection ( e nd) ;
}
} )
. show ( ) ;
@ -834,10 +865,9 @@ public class FragmentCompose extends FragmentBase {
return ;
}
etBody . setText ( s) ;
etBody . setText ( s s) ;
etBody . setSelection ( end ) ;
}
}
private void onMenuSendAfter ( ) {
DialogDuration . show ( getContext ( ) , getViewLifecycleOwner ( ) , R . string . title_send_at ,