Buggy code:
_Read = true ; } if ( ( tMessage . getMergedStatus ( ) ) == ( Message . STATUS_SEND_FAILED ) ) { _Info = getResources ( ) . getString ( send_failed ) ; _Error = true ; } if ( _Info == null ) _Info = UIHelper . getMessageDisplayName ( tMessage ) ; if ( _Error ) { Log . e ( FxUi . TAG , "ERROR<seq2seq4repair_space>IN<seq2seq4repair_space>[<seq2seq4repair_space>refreshFxUi<seq2seq4repair_space>]<seq2seq4repair_space>STATE<seq2seq4repair_space>[<seq2seq4repair_space>SINGLE_CONVERSATION<seq2seq4repair_space>]" ) ; continue ; } View tRow = null ; switch ( tMessage . getType ( ) ) { case Message . TYPE_TEXT : if ( FxUiHelper . isMessageReceived ( tMessage ) ) tRow = getLayoutInflater ( ) . inflate ( fx_msg_recv_text , mLayout , false ) ; else tRow = getLayoutInflater ( ) . inflate ( fx_msg_sent_text , mLayout , false ) ; ( ( EmojiconTextView ) ( tRow . findViewById ( message_text ) ) ) . setText ( tMessage . getBody ( ) ) ; break ; case Message . TYPE_IMAGE : tRow = getLayoutInflater ( ) . inflate ( fx_msg_sent_image , mLayout , false ) ; loadBitmap ( tMessage , ( ( ImageView ) ( tRow . findViewById ( message_image ) ) ) ) ; break ; case Message . TYPE_FILE : if ( ( tMessage . getFileParams ( ) . width ) > 0 ) { tRow = getLayoutInflater ( ) . inflate ( fx_msg_recv_image , mLayout , false ) ; loadBitmap ( tMessage , ( ( ImageView ) ( tRow . findViewById ( message_image ) ) ) ) ; } else if ( ( ( tMessage . getMimeType ( ) ) != null ) && ( tMessage . getMimeType ( ) . startsWith ( "audio//" ) ) ) { if ( FxUiHelper . isMessageReceived ( tMessage ) ) tRow = getLayoutInflater ( ) . inflate ( fx_msg_recv_audio , mLayout , false ) ; else tRow = getLayoutInflater ( ) . inflate ( fx_msg_sent_audio , mLayout , false ) ; AudioWife _AudioPlayer = new AudioWife ( ) ; RelativeLayout _AudioPlayerViewGroup = new RelativeLayout ( FxUi . App ) ; _AudioPlayer . init ( FxUi . App , Uri . fromFile ( xmppConnectionService . getFileBackend ( ) . getFile ( tMessage ) ) ) ; _AudioPlayer . useDefaultUi ( _AudioPlayerViewGroup , getLayoutInflater ( ) ) ; ( ( LinearLayout ) ( tRow . findViewById ( message_audio ) ) ) . addView ( _AudioPlayer . getPlayerUi ( ) ) ; } break ; } if ( tRow == null ) continue ; String _Time = UIHelper . readableTimeDifference ( FxUi . App , tMessage . getMergedTimeSent ( ) ) ; EmojiconTextView tMessageInfo = ( ( EmojiconTextView ) ( tRow . findViewById ( message_information ) ) ) ; if ( ( tMessage . getMergedStatus ( ) ) <= ( Message . STATUS_RECEIVED ) ) { if ( ( _FileSize != null ) && ( _Info != null ) ) tMessageInfo . setText ( ( ( ( ( _Time + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _FileSize ) + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _Info ) ) ; else if ( ( _FileSize == null ) && ( _Info != null ) ) tMessageInfo . setText ( ( ( _Time + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _Info ) ) ; else if ( _FileSize != null ) tMessageInfo . setText ( ( ( _Time + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _FileSize ) ) ; else tMessageInfo . setText ( _Time ) ; } else { if ( ( _FileSize != null ) && ( _Info != null ) ) tMessageInfo . setText ( ( ( _FileSize + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _Info ) ) ; else if ( ( _FileSize == null ) && ( _Info != null ) ) tMessageInfo . setText ( ( ( _Info + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _Time ) ) ; else if ( _FileSize != null ) tMessageInfo . setText ( ( ( _FileSize + "<seq2seq4repair_space>·<seq2seq4repair_space>" ) + _Time ) ) ; else tMessageInfo . setText ( _Time ) ; } if ( ( tRow . findViewById ( message_received ) ) != null ) if ( ! _Received ) tRow . findViewById ( message_received ) . setVisibility ( GONE ) ; if ( ( tRow . findViewById ( message_read ) ) != null ) if ( ! _Read ) tRow . findViewById ( message_read ) . setVisibility ( GONE ) ; if ( ( tMessage . getEncryption ( ) ) == ( Message . ENCRYPTION_NONE ) ) tRow . findViewById ( message_security ) . setVisibility ( GONE ) ; mLayout . addView ( tRow ) ; } mScroll . post ( new Runnable ( ) { @ Override public void run ( ) { <START_BUG> mScroll . scrollTo ( 0 , mScroll . getBottom ( ) ) ; <END_BUG> } } ) ; if ( change ) mFooter . addView ( getLayoutInflater ( ) . inflate ( fx_msg_input , mFooter , false ) ) ; } Log . i ( FxUi . TAG , ( ( "WORK<seq2seq4repair_space>DONE<seq2seq4repair_space>(<seq2seq4repair_space>" + ( ( System . currentTimeMillis ( ) ) - workStart ) ) + "ms<seq2seq4repair_space>)<seq2seq4repair_space>[<seq2seq4repair_space>refreshFxUi<seq2seq4repair_space>]" ) ) ; if ( change && animate ) { Log . i ( FxUi . TAG , "ANIMATION<seq2seq4repair_space>TO<seq2seq4repair_space>ALPHA:1<seq2seq4repair_space>[<seq2seq4repair_space>refreshFxUi<seq2seq4repair_space>]" ) ; mParent . animate ( ) . alpha ( 1 ) . setDuration ( 200 ) . start ( ) ; } mHandler . postDelayed ( new Runnable ( ) { @ Override public void run ( ) { InStateRefresh = false ; if ( StateRefreshQueued ) { StateRefreshQueued = false ; refreshFxUi ( mFxState , false ) ; } } } , ( change && animate ? 250 : 0 ) ) ; } } , ( change && animate ? 250 : 0 ) ) ; } @ Override public void onBackPressed ( ) { } @ Override public boolean onOptionsItemSelected ( MenuItem item ) { } @ Override public void onConversationUpdate ( ) { } public enum State { STARTUP , RECENT_CONVERSATIONS , SINGLE_CONVERSATION , CONTACTS , GROUPS ;

Fix:
mScroll . fullScroll ( FOCUS_DOWN ) ;