@ -430,6 +430,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private ImageButton ibSearchText ;
private ImageButton ibSearch ;
private ImageButton ibTranslate ;
private ImageButton ibForceLight ;
private ImageButton ibHide ;
private ImageButton ibSeen ;
private ImageButton ibAnswer ;
@ -805,6 +806,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearchText = vsBody . findViewById ( R . id . ibSearchText ) ;
ibSearch = vsBody . findViewById ( R . id . ibSearch ) ;
ibTranslate = vsBody . findViewById ( R . id . ibTranslate ) ;
ibForceLight = vsBody . findViewById ( R . id . ibForceLight ) ;
ibHide = vsBody . findViewById ( R . id . ibHide ) ;
ibSeen = vsBody . findViewById ( R . id . ibSeen ) ;
ibAnswer = vsBody . findViewById ( R . id . ibAnswer ) ;
@ -921,6 +923,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearch . setOnClickListener ( this ) ;
ibTranslate . setOnClickListener ( this ) ;
ibTranslate . setOnLongClickListener ( this ) ;
ibForceLight . setOnClickListener ( this ) ;
ibHide . setOnClickListener ( this ) ;
ibSeen . setOnClickListener ( this ) ;
ibAnswer . setOnClickListener ( this ) ;
@ -1016,6 +1019,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearch . setOnClickListener ( null ) ;
ibTranslate . setOnClickListener ( null ) ;
ibTranslate . setOnLongClickListener ( null ) ;
ibForceLight . setOnClickListener ( null ) ;
ibHide . setOnClickListener ( null ) ;
ibSeen . setOnClickListener ( null ) ;
ibAnswer . setOnClickListener ( null ) ;
@ -1529,6 +1533,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearchText . setVisibility ( View . GONE ) ;
ibSearch . setVisibility ( View . GONE ) ;
ibTranslate . setVisibility ( View . GONE ) ;
ibForceLight . setVisibility ( View . GONE ) ;
ibHide . setVisibility ( View . GONE ) ;
ibSeen . setVisibility ( View . GONE ) ;
ibAnswer . setVisibility ( View . GONE ) ;
@ -1763,6 +1768,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearchText . setVisibility ( View . GONE ) ;
ibSearch . setVisibility ( View . GONE ) ;
ibTranslate . setVisibility ( View . GONE ) ;
ibForceLight . setVisibility ( View . GONE ) ;
ibHide . setVisibility ( View . GONE ) ;
ibSeen . setVisibility ( View . GONE ) ;
ibAnswer . setVisibility ( View . GONE ) ;
@ -1932,7 +1938,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean headers = ( message . uid ! = null | |
( message . accountProtocol = = EntityAccount . TYPE_POP & & message . headers ! = null ) ) ;
evalProperties ( message ) ; // TODO: done again in bindBody
boolean full = properties . getValue ( "full" , message . id ) ;
boolean dark = Helper . isDarkTheme ( context ) ;
boolean force_light = properties . getValue ( "force_light" , message . id ) ;
SharedPreferences prefs = PreferenceManager . getDefaultSharedPreferences ( context ) ;
boolean expand_all = prefs . getBoolean ( "expand_all" , false ) ;
@ -1948,6 +1958,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean button_seen = prefs . getBoolean ( "button_seen" , false ) ;
boolean button_hide = prefs . getBoolean ( "button_hide" , false ) ;
boolean button_translate = prefs . getBoolean ( "button_translate" , true ) ;
boolean button_force_light = prefs . getBoolean ( "button_force_light" , false ) ;
boolean button_search = prefs . getBoolean ( "button_search" , false ) ;
boolean button_search_text = prefs . getBoolean ( "button_search_text" , false ) ;
boolean button_event = prefs . getBoolean ( "button_event" , false ) ;
@ -1977,6 +1988,8 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearchText . setVisibility ( tools & & ! outbox & & button_search_text & & message . content & & ! full ? View . VISIBLE : View . GONE ) ;
ibSearch . setVisibility ( tools & & ! outbox & & button_search & & ( froms > 0 | | tos > 0 ) ? View . VISIBLE : View . GONE ) ;
ibTranslate . setVisibility ( tools & & ! outbox & & button_translate & & DeepL . isAvailable ( context ) & & message . content ? View . VISIBLE : View . GONE ) ;
ibForceLight . setVisibility ( tools & & full & & dark & & button_force_light & & message . content ? View . VISIBLE : View . GONE ) ;
ibForceLight . setImageLevel ( force_light ? 1 : 0 ) ;
ibHide . setVisibility ( tools & & button_hide & & ! outbox ? View . VISIBLE : View . GONE ) ;
ibSeen . setVisibility ( tools & & button_seen & & ! outbox & & seen ? View . VISIBLE : View . GONE ) ;
ibAnswer . setVisibility ( ! tools | | outbox | | ( ! expand_all & & expand_one ) | | ! threading ? View . GONE : View . VISIBLE ) ;
@ -2218,26 +2231,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} ) ;
}
private void bindBody ( TupleMessageEx message , final boolean scroll ) {
if ( ! Objects . equals ( tvBody . getTag ( ) , message . id ) ) {
tvBody . setTag ( message . id ) ;
tvBody . setText ( null ) ;
}
properties . endSearch ( ) ;
clearActions ( ) ;
ibSeenBottom . setImageResource ( message . ui_seen
? R . drawable . twotone_mail_24 : R . drawable . twotone_drafts_24 ) ;
ibSeenBottom . setVisibility ( ! ( message . folderReadOnly | | message . uid = = null ) | |
message . accountProtocol = = EntityAccount . TYPE_POP
? View . VISIBLE : View . GONE ) ;
if ( ! message . content ) {
if ( scroll )
properties . scrollTo ( getAdapterPosition ( ) , 0 ) ;
return ;
}
private void evalProperties ( TupleMessageEx message ) {
if ( message . from ! = null )
for ( Address sender : message . from ) {
String from = ( ( InternetAddress ) sender ) . getAddress ( ) ;
@ -2274,11 +2268,35 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
properties . setValue ( "full" , message . id , true ) ;
properties . setValue ( "full_asked" , message . id , true ) ;
}
}
private void bindBody ( TupleMessageEx message , final boolean scroll ) {
if ( ! Objects . equals ( tvBody . getTag ( ) , message . id ) ) {
tvBody . setTag ( message . id ) ;
tvBody . setText ( null ) ;
}
properties . endSearch ( ) ;
clearActions ( ) ;
ibSeenBottom . setImageResource ( message . ui_seen
? R . drawable . twotone_mail_24 : R . drawable . twotone_drafts_24 ) ;
ibSeenBottom . setVisibility ( ! ( message . folderReadOnly | | message . uid = = null ) | |
message . accountProtocol = = EntityAccount . TYPE_POP
? View . VISIBLE : View . GONE ) ;
if ( ! message . content ) {
if ( scroll )
properties . scrollTo ( getAdapterPosition ( ) , 0 ) ;
return ;
}
evalProperties ( message ) ;
boolean show_full = properties . getValue ( "full" , message . id ) ;
boolean show_images = properties . getValue ( "images" , message . id ) ;
boolean show_quotes = ( properties . getValue ( "quotes" , message . id ) | | ! collapse_quotes ) ;
boolean force_light = properties . getValue ( "force_light" , message . id ) ;
boolean always_images = prefs . getBoolean ( "html_always_images" , false ) ;
if ( always_images & & show_full ) {
show_images = true ;
@ -2348,7 +2366,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
webView . setMinimumHeight ( height ) ;
webView . init ( height , size , position ,
webView . init ( height , size , position , force_light ,
new WebViewEx . IWebView ( ) {
@Override
public void onSizeChanged ( int w , int h , int ow , int oh ) {
@ -3385,6 +3403,8 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
DeepL . FragmentDialogDeepL fragment = new DeepL . FragmentDialogDeepL ( ) ;
fragment . show ( parentFragment . getParentFragmentManager ( ) , "deepl:configure" ) ;
}
} else if ( id = = R . id . ibForceLight ) {
onActionForceLight ( message ) ;
} else if ( id = = R . id . ibAnswer ) {
onActionAnswer ( message , ibAnswer ) ;
} else if ( id = = R . id . ibNotes ) {
@ -4178,20 +4198,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if ( full ) {
TextView tvDark = dview . findViewById ( R . id . tvDark ) ;
CheckBox cbDark = dview . findViewById ( R . id . cbDark ) ;
CheckBox cbAlwaysImages = dview . findViewById ( R . id . cbAlwaysImages ) ;
boolean confirm_html = prefs . getBoolean ( "confirm_html" , true ) ;
cbDark . setChecked ( prefs . getBoolean ( "html_dark" , confirm_html ) ) ;
cbAlwaysImages . setChecked ( prefs . getBoolean ( "html_always_images" , false ) ) ;
cbDark . setOnCheckedChangeListener ( new CompoundButton . OnCheckedChangeListener ( ) {
@Override
public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) {
prefs . edit ( ) . putBoolean ( "html_dark" , isChecked ) . apply ( ) ;
}
} ) ;
cbAlwaysImages . setOnCheckedChangeListener ( new CompoundButton . OnCheckedChangeListener ( ) {
@Override
public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) {
@ -4201,10 +4212,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean isDark = Helper . isDarkTheme ( context ) ;
boolean canDark = WebViewEx . isFeatureSupported ( WebViewFeature . FORCE_DARK ) ;
tvDark . setVisibility ( isDark & & ! canDark ? View . VISIBLE : View . GONE ) ;
cbDark . setVisibility ( isDark & & canDark ? View . VISIBLE : View . GONE ) ;
} else {
boolean disable_tracking = prefs . getBoolean ( "disable_tracking" , true ) ;
@ -4360,8 +4368,11 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
}
private void onActionOpenFullConfirmed ( final TupleMessageEx message ) {
boolean force_light = properties . getValue ( "force_light" , message . id ) ;
Bundle args = new Bundle ( ) ;
args . putLong ( "id" , message . id ) ;
args . putBoolean ( "force_light" , force_light ) ;
new SimpleTask < String > ( ) {
@Override
@ -4387,6 +4398,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
protected void onExecuted ( Bundle args , String html ) {
Bundle fargs = new Bundle ( ) ;
fargs . putString ( "html" , html ) ;
fargs . putBoolean ( "force_light" , args . getBoolean ( "force_light" ) ) ;
FragmentDialogOpenFull dialog = new FragmentDialogOpenFull ( ) ;
dialog . setArguments ( fargs ) ;
@ -4610,6 +4622,8 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private void onActionMore ( TupleMessageEx message ) {
boolean show_headers = properties . getValue ( "headers" , message . id ) ;
boolean full = properties . getValue ( "full" , message . id ) ;
boolean dark = Helper . isDarkTheme ( context ) ;
boolean force_light = properties . getValue ( "force_light" , message . id ) ;
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle ( context , powner , ibMore ) ;
popupMenu . inflate ( R . menu . popup_message_more ) ;
@ -4655,6 +4669,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu . getMenu ( ) . findItem ( R . id . menu_translate ) . setVisible (
DeepL . isAvailable ( context ) & & message . content ) ;
popupMenu . getMenu ( ) . findItem ( R . id . menu_force_light ) . setVisible ( full & & dark ) ;
popupMenu . getMenu ( ) . findItem ( R . id . menu_force_light ) . setChecked ( force_light ) ;
popupMenu . getMenu ( ) . findItem ( R . id . menu_share ) . setEnabled ( message . content ) ;
popupMenu . getMenu ( ) . findItem ( R . id . menu_pin ) . setVisible ( pin ) ;
popupMenu . getMenu ( ) . findItem ( R . id . menu_event ) . setEnabled ( message . content ) ;
@ -4736,6 +4753,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} else if ( itemId = = R . id . menu_translate ) {
onActionTranslate ( message ) ;
return true ;
} else if ( itemId = = R . id . menu_force_light ) {
onActionForceLight ( message ) ;
return true ;
} else if ( itemId = = R . id . menu_event ) {
if ( ActivityBilling . isPro ( context ) )
onMenuShare ( message , true ) ;
@ -5140,6 +5160,13 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
fragment . show ( parentFragment . getParentFragmentManager ( ) , "message:translate" ) ;
}
private void onActionForceLight ( TupleMessageEx message ) {
boolean force_light = ! properties . getValue ( "force_light" , message . id ) ;
properties . setValue ( "force_light" , message . id , force_light ) ;
ibForceLight . setImageLevel ( force_light ? 1 : 0 ) ;
bindBody ( message , false ) ;
}
private void onSearchText ( TupleMessageEx message ) {
properties . startSearch ( tvBody ) ;
}
@ -7261,19 +7288,20 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
@Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
String html = getArguments ( ) . getString ( "html" ) ;
Bundle args = getArguments ( ) ;
String html = args . getString ( "html" ) ;
boolean force_light = args . getBoolean ( "force_light" ) ;
SharedPreferences prefs = PreferenceManager . getDefaultSharedPreferences ( getContext ( ) ) ;
final Context context = getContext ( ) ;
SharedPreferences prefs = PreferenceManager . getDefaultSharedPreferences ( context ) ;
boolean overview_mode = prefs . getBoolean ( "overview_mode" , false ) ;
boolean safe_browsing = prefs . getBoolean ( "safe_browsing" , false ) ;
boolean confirm_html = prefs . getBoolean ( "confirm_html" , true ) ;
boolean html_dark = prefs . getBoolean ( "html_dark" , confirm_html ) ;
View view = inflater . inflate ( R . layout . fragment_open_full , container , false ) ;
WebView wv = view . findViewById ( R . id . wv ) ;
WebSettings settings = wv . getSettings ( ) ;
settings . setUserAgentString ( WebViewEx . getUserAgent ( getContext( ) , wv ) ) ;
settings . setUserAgentString ( WebViewEx . getUserAgent ( context , wv ) ) ;
settings . setUseWideViewPort ( true ) ;
settings . setLoadWithOverviewMode ( overview_mode ) ;
@ -7289,10 +7317,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if ( Build . VERSION . SDK_INT > = Build . VERSION_CODES . O )
settings . setSafeBrowsingEnabled ( safe_browsing ) ;
if ( html_dark & &
WebViewEx . isFeatureSupported ( WebViewFeature . FORCE_DARK ) )
WebSettingsCompat . setForceDark ( settings ,
Helper . isDarkTheme ( getContext ( ) ) ? FORCE_DARK_ON : FORCE_DARK_OFF ) ;
boolean dark = ( Helper . isDarkTheme ( context ) & & ! force_light ) ;
if ( WebViewEx . isFeatureSupported ( WebViewFeature . FORCE_DARK ) )
WebSettingsCompat . setForceDark ( settings , dark ? FORCE_DARK_ON : FORCE_DARK_OFF ) ;
settings . setLoadsImagesAutomatically ( true ) ;
settings . setBlockNetworkLoads ( false ) ;
@ -7378,6 +7405,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
final CheckBox cbSearch = dview . findViewById ( R . id . cbSearch ) ;
final CheckBox cbSearchText = dview . findViewById ( R . id . cbSearchText ) ;
final CheckBox cbTranslate = dview . findViewById ( R . id . cbTranslate ) ;
final CheckBox cbForceLight = dview . findViewById ( R . id . cbForceLight ) ;
final CheckBox cbEvent = dview . findViewById ( R . id . cbEvent ) ;
final CheckBox cbShare = dview . findViewById ( R . id . cbShare ) ;
final CheckBox cbPin = dview . findViewById ( R . id . cbPin ) ;
@ -7401,6 +7429,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
cbSearch . setChecked ( prefs . getBoolean ( "button_search" , false ) ) ;
cbSearchText . setChecked ( prefs . getBoolean ( "button_search_text" , false ) ) ;
cbTranslate . setChecked ( prefs . getBoolean ( "button_translate" , true ) ) ;
cbForceLight . setChecked ( prefs . getBoolean ( "button_force_light" , false ) ) ;
cbEvent . setChecked ( prefs . getBoolean ( "button_event" , false ) ) ;
cbShare . setChecked ( prefs . getBoolean ( "button_share" , false ) ) ;
cbPin . setChecked ( prefs . getBoolean ( "button_pin" , false ) ) ;
@ -7427,6 +7456,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
editor . putBoolean ( "button_search" , cbSearch . isChecked ( ) ) ;
editor . putBoolean ( "button_search_text" , cbSearchText . isChecked ( ) ) ;
editor . putBoolean ( "button_translate" , cbTranslate . isChecked ( ) ) ;
editor . putBoolean ( "button_force_light" , cbForceLight . isChecked ( ) ) ;
editor . putBoolean ( "button_event" , cbEvent . isChecked ( ) ) ;
editor . putBoolean ( "button_share" , cbShare . isChecked ( ) ) ;
editor . putBoolean ( "button_pin" , cbPin . isChecked ( ) ) ;