2019-05-18 11:10:30 +02:00
package app.fedilab.android.fragments ;
2017-05-05 16:36:04 +02:00
/ * Copyright 2017 Thomas Schneider
*
2019-05-18 11:10:30 +02:00
* This file is a part of Fedilab
2017-05-05 16:36:04 +02:00
*
* This program is free software ; you can redistribute it and / or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation ; either version 3 of the
* License , or ( at your option ) any later version .
*
2019-05-18 11:10:30 +02:00
* Fedilab is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even
2017-05-05 16:36:04 +02:00
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU General
* Public License for more details .
*
2019-05-18 11:10:30 +02:00
* You should have received a copy of the GNU General Public License along with Fedilab ; if not ,
2017-05-05 16:36:04 +02:00
* see < http : //www.gnu.org/licenses>. */
2018-11-17 14:31:03 +01:00
2018-10-20 14:39:24 +02:00
import android.app.Activity ;
2019-01-10 11:51:25 +01:00
import android.content.BroadcastReceiver ;
2017-05-05 16:36:04 +02:00
import android.content.Context ;
2017-08-26 19:39:11 +02:00
import android.content.Intent ;
2019-01-10 11:51:25 +01:00
import android.content.IntentFilter ;
2017-05-05 16:36:04 +02:00
import android.content.SharedPreferences ;
2018-01-04 17:39:16 +01:00
import android.database.sqlite.SQLiteDatabase ;
2017-05-05 16:36:04 +02:00
import android.os.AsyncTask ;
import android.os.Bundle ;
2017-11-03 10:18:47 +01:00
import android.os.Handler ;
import android.os.Looper ;
2019-09-06 17:55:14 +02:00
2019-06-11 19:38:26 +02:00
import androidx.annotation.NonNull ;
import androidx.fragment.app.Fragment ;
import androidx.localbroadcastmanager.content.LocalBroadcastManager ;
2019-11-06 18:03:45 +01:00
import androidx.preference.PreferenceManager ;
2019-06-11 19:38:26 +02:00
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout ;
import androidx.recyclerview.widget.LinearLayoutManager ;
import androidx.recyclerview.widget.RecyclerView ;
2019-08-17 11:10:31 +02:00
2017-05-05 16:36:04 +02:00
import android.view.LayoutInflater ;
import android.view.View ;
import android.view.ViewGroup ;
import android.widget.RelativeLayout ;
2019-01-12 17:55:18 +01:00
import android.widget.TextView ;
2017-05-30 19:31:44 +02:00
import android.widget.Toast ;
2018-11-17 14:31:03 +01:00
2017-05-05 16:36:04 +02:00
import java.util.ArrayList ;
2019-01-22 08:51:36 +01:00
import java.util.Date ;
2018-11-21 18:04:10 +01:00
import java.util.Iterator ;
2017-05-05 16:36:04 +02:00
import java.util.List ;
2017-09-13 08:47:59 +02:00
2019-05-18 11:10:30 +02:00
import app.fedilab.android.client.APIResponse ;
import app.fedilab.android.client.Entities.Account ;
import app.fedilab.android.client.Entities.Conversation ;
import app.fedilab.android.client.Entities.Peertube ;
import app.fedilab.android.client.Entities.RemoteInstance ;
2019-05-25 12:37:50 +02:00
import app.fedilab.android.client.Entities.RetrieveFeedsParam ;
2019-05-18 11:10:30 +02:00
import app.fedilab.android.client.Entities.Status ;
import app.fedilab.android.client.Entities.TagTimeline ;
import app.fedilab.android.drawers.ArtListAdapter ;
import app.fedilab.android.drawers.PeertubeAdapter ;
import app.fedilab.android.drawers.PixelfedListAdapter ;
import app.fedilab.android.drawers.StatusListAdapter ;
import app.fedilab.android.helper.Helper ;
import app.fedilab.android.services.StreamingFederatedTimelineService ;
import app.fedilab.android.services.StreamingLocalTimelineService ;
import app.fedilab.android.sqlite.InstancesDAO ;
import app.fedilab.android.sqlite.SearchDAO ;
import app.fedilab.android.sqlite.Sqlite ;
2018-11-25 10:45:16 +01:00
import es.dmoral.toasty.Toasty ;
2019-05-18 11:10:30 +02:00
import app.fedilab.android.R ;
import app.fedilab.android.activities.BaseMainActivity ;
import app.fedilab.android.activities.MainActivity ;
import app.fedilab.android.asynctasks.ManageListsAsyncTask ;
import app.fedilab.android.asynctasks.RetrieveFeedsAfterBookmarkAsyncTask ;
import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask ;
import app.fedilab.android.asynctasks.RetrieveMissingFeedsAsyncTask ;
import app.fedilab.android.asynctasks.RetrievePeertubeSearchAsyncTask ;
import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask ;
import app.fedilab.android.interfaces.OnListActionInterface ;
import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface ;
import app.fedilab.android.interfaces.OnRetrieveFeedsInterface ;
import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface ;
2017-05-05 16:36:04 +02:00
/ * *
* Created by Thomas on 24 / 04 / 2017 .
* Fragment to display content related to status
* /
2019-04-22 13:16:35 +02:00
public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsInterface , OnRetrieveMissingFeedsInterface , OnRetrieveFeedsAfterBookmarkInterface , OnListActionInterface {
2017-05-05 16:36:04 +02:00
private boolean flag_loading ;
private Context context ;
private AsyncTask < Void , Void , Void > asyncTask ;
private StatusListAdapter statusListAdapter ;
2018-10-06 15:59:00 +02:00
private PeertubeAdapter peertubeAdapater ;
2019-01-14 18:16:45 +01:00
private ArtListAdapter artListAdapter ;
private PixelfedListAdapter pixelfedListAdapter ;
2017-05-05 16:36:04 +02:00
private String max_id ;
2017-09-13 08:38:08 +02:00
private List < Status > statuses ;
2018-10-06 15:59:00 +02:00
private List < Peertube > peertubes ;
2017-06-19 15:59:34 +02:00
private RetrieveFeedsAsyncTask . Type type ;
2017-05-05 16:36:04 +02:00
private RelativeLayout mainLoader , nextElementLoader , textviewNoAction ;
private boolean firstLoad ;
private SwipeRefreshLayout swipeRefreshLayout ;
private String targetedId ;
private String tag ;
2017-10-14 14:36:48 +02:00
private RecyclerView lv_status ;
2018-09-05 10:19:07 +02:00
private boolean showMediaOnly , showPinned , showReply ;
2019-05-12 09:21:42 +02:00
private Intent streamingFederatedIntent , streamingLocalIntent ;
2017-10-24 14:06:28 +02:00
LinearLayoutManager mLayoutManager ;
2019-08-18 17:17:47 +02:00
private boolean firstTootsLoaded ;
2017-12-28 17:25:36 +01:00
private String userId , instance ;
2017-12-28 15:33:02 +01:00
private SharedPreferences sharedpreferences ;
2018-04-25 14:03:15 +02:00
private boolean isSwipped ;
2018-08-20 19:00:20 +02:00
private String remoteInstance ;
2018-09-26 13:45:13 +02:00
private List < String > mutedAccount ;
2018-10-06 15:59:00 +02:00
private String instanceType ;
2018-10-22 19:19:39 +02:00
private String search_peertube , remote_channel_name ;
2018-11-25 16:29:38 +01:00
private String initialBookMark ;
2018-12-15 17:13:06 +01:00
private TagTimeline tagTimeline ;
2018-12-19 15:12:46 +01:00
private String updatedBookMark ;
private String lastReadToot ;
2019-01-12 17:55:18 +01:00
private TextView textviewNoActionText ;
2019-01-03 18:59:44 +01:00
private boolean ischannel ;
2019-01-07 19:16:15 +01:00
private boolean ownVideos ;
2019-01-10 11:51:25 +01:00
private BroadcastReceiver receive_action ;
2019-09-06 17:55:14 +02:00
private BroadcastReceiver receive_data ;
2019-01-22 08:51:36 +01:00
private Date lastReadTootDate , initialBookMarkDate , updatedBookMarkDate ;
2019-04-26 15:50:26 +02:00
private int timelineId ;
2019-05-25 12:37:50 +02:00
private String currentfilter ;
2019-09-06 17:55:14 +02:00
public DisplayStatusFragment ( ) {
2017-08-24 15:57:35 +02:00
}
2017-05-05 16:36:04 +02:00
@Override
2017-11-11 07:43:11 +01:00
public View onCreateView ( @NonNull LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
2017-05-05 16:36:04 +02:00
View rootView = inflater . inflate ( R . layout . fragment_status , container , false ) ;
2017-05-26 17:20:36 +02:00
statuses = new ArrayList < > ( ) ;
2018-10-06 15:59:00 +02:00
peertubes = new ArrayList < > ( ) ;
2017-05-05 16:36:04 +02:00
context = getContext ( ) ;
Bundle bundle = this . getArguments ( ) ;
2017-08-03 14:38:47 +02:00
showMediaOnly = false ;
2017-12-09 07:34:36 +01:00
//Will allow to load first toots if bookmark != null
2018-12-19 15:12:46 +01:00
firstTootsLoaded = false ;
2017-09-15 19:51:41 +02:00
showPinned = false ;
2018-09-05 10:19:07 +02:00
showReply = false ;
2018-12-15 17:13:06 +01:00
tagTimeline = null ;
2017-05-05 16:36:04 +02:00
if ( bundle ! = null ) {
type = ( RetrieveFeedsAsyncTask . Type ) bundle . get ( " type " ) ;
2019-01-03 18:59:44 +01:00
targetedId = bundle . getString ( " targetedid " , null ) ;
2019-01-07 19:16:15 +01:00
ownVideos = bundle . getBoolean ( " ownvideos " , false ) ; //Peetube account watching its videos
2017-05-05 16:36:04 +02:00
tag = bundle . getString ( " tag " , null ) ;
2019-09-06 17:55:14 +02:00
showMediaOnly = bundle . getBoolean ( " showMediaOnly " , false ) ;
showPinned = bundle . getBoolean ( " showPinned " , false ) ;
showReply = bundle . getBoolean ( " showReply " , false ) ;
2018-08-20 19:00:20 +02:00
remoteInstance = bundle . getString ( " remote_instance " , " " ) ;
2018-10-20 12:22:35 +02:00
search_peertube = bundle . getString ( " search_peertube " , null ) ;
2018-10-22 19:19:39 +02:00
remote_channel_name = bundle . getString ( " remote_channel_name " , null ) ;
2019-09-06 17:55:14 +02:00
instanceType = bundle . getString ( " instanceType " , " MASTODON " ) ;
ischannel = bundle . getBoolean ( " ischannel " , false ) ;
2019-04-26 15:50:26 +02:00
timelineId = bundle . getInt ( " timelineId " ) ;
2019-05-25 12:37:50 +02:00
currentfilter = bundle . getString ( " currentfilter " , null ) ;
2017-05-05 16:36:04 +02:00
}
2019-09-06 17:55:14 +02:00
if ( ischannel )
2019-01-03 18:59:44 +01:00
type = RetrieveFeedsAsyncTask . Type . CHANNEL ;
2019-11-06 18:03:45 +01:00
2019-01-03 18:59:44 +01:00
2018-10-06 15:59:00 +02:00
SQLiteDatabase db = Sqlite . getInstance ( context , Sqlite . DB_NAME , null , Sqlite . DB_VERSION ) . open ( ) ;
2019-01-03 14:23:13 +01:00
//instanceType should not be null only for Peertube accounts
2019-04-21 18:50:56 +02:00
2019-09-06 17:55:14 +02:00
if ( remoteInstance ! = null & & ! remoteInstance . equals ( " " ) & & instanceType = = null ) {
2018-10-06 15:59:00 +02:00
List < RemoteInstance > remoteInstanceObj = new InstancesDAO ( context , db ) . getInstanceByName ( remoteInstance ) ;
2019-09-06 17:55:14 +02:00
if ( remoteInstanceObj ! = null & & remoteInstanceObj . size ( ) > 0 )
2018-10-06 15:59:00 +02:00
instanceType = remoteInstanceObj . get ( 0 ) . getType ( ) ;
}
2018-04-25 14:03:15 +02:00
isSwipped = false ;
2017-05-05 16:36:04 +02:00
max_id = null ;
flag_loading = true ;
firstLoad = true ;
2018-12-19 15:12:46 +01:00
initialBookMark = null ;
2017-11-15 09:44:12 +01:00
assert context ! = null ;
2017-12-28 15:33:02 +01:00
sharedpreferences = context . getSharedPreferences ( Helper . APP_PREFS , Context . MODE_PRIVATE ) ;
2017-12-06 16:45:07 +01:00
boolean isOnWifi = Helper . isOnWIFI ( context ) ;
2017-10-21 17:15:52 +02:00
swipeRefreshLayout = rootView . findViewById ( R . id . swipeContainer ) ;
2019-11-12 21:27:02 +01:00
int c1 = getResources ( ) . getColor ( R . color . cyanea_accent ) ;
int c2 = getResources ( ) . getColor ( R . color . cyanea_primary_dark ) ;
int c3 = getResources ( ) . getColor ( R . color . cyanea_primary ) ;
swipeRefreshLayout . setProgressBackgroundColorSchemeColor ( c3 ) ;
2019-11-12 19:08:05 +01:00
swipeRefreshLayout . setColorSchemeColors (
2019-11-12 21:27:02 +01:00
c1 , c2 , c1
2019-11-12 19:08:05 +01:00
) ;
2017-10-21 17:15:52 +02:00
lv_status = rootView . findViewById ( R . id . lv_status ) ;
2019-09-06 17:55:14 +02:00
mainLoader = rootView . findViewById ( R . id . loader ) ;
2017-10-21 17:15:52 +02:00
nextElementLoader = rootView . findViewById ( R . id . loading_next_status ) ;
2019-09-06 17:55:14 +02:00
textviewNoAction = rootView . findViewById ( R . id . no_action ) ;
2019-01-12 17:55:18 +01:00
textviewNoActionText = rootView . findViewById ( R . id . no_action_text ) ;
2017-05-05 16:36:04 +02:00
mainLoader . setVisibility ( View . VISIBLE ) ;
nextElementLoader . setVisibility ( View . GONE ) ;
2018-10-20 16:26:45 +02:00
userId = sharedpreferences . getString ( Helper . PREF_KEY_ID , null ) ;
2019-09-06 17:55:14 +02:00
instance = sharedpreferences . getString ( Helper . PREF_INSTANCE , context ! = null ? Helper . getLiveInstance ( context ) : null ) ;
2019-08-18 17:17:47 +02:00
2018-09-26 13:45:13 +02:00
2018-12-19 15:12:46 +01:00
//For Home timeline, fetch stored values for bookmark and last read toot
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2018-12-19 15:12:46 +01:00
initialBookMark = sharedpreferences . getString ( Helper . BOOKMARK_ID + userId + instance , null ) ;
2019-09-06 17:55:14 +02:00
initialBookMarkDate = Helper . stringToDate ( context , sharedpreferences . getString ( Helper . BOOKMARK_DATE + userId + instance , null ) ) ;
2018-12-19 15:12:46 +01:00
lastReadToot = sharedpreferences . getString ( Helper . LAST_READ_TOOT_ID + userId + instance , null ) ;
2019-09-06 17:55:14 +02:00
lastReadTootDate = Helper . stringToDate ( context , sharedpreferences . getString ( Helper . LAST_READ_TOOT_DATE + userId + instance , null ) ) ;
2018-12-19 15:12:46 +01:00
}
2019-09-06 17:55:14 +02:00
if ( instanceType = = null | | instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) {
if ( type = = RetrieveFeedsAsyncTask . Type . TAG & & tag ! = null ) {
2019-01-14 18:16:45 +01:00
BaseMainActivity . displayPeertube = null ;
List < TagTimeline > tagTimelines = new SearchDAO ( context , db ) . getTimelineInfo ( tag ) ;
2019-09-06 17:55:14 +02:00
if ( tagTimelines ! = null & & tagTimelines . size ( ) > 0 ) {
2019-01-14 18:16:45 +01:00
tagTimeline = tagTimelines . get ( 0 ) ;
2019-08-18 17:17:47 +02:00
statusListAdapter = new StatusListAdapter ( tagTimeline , targetedId , isOnWifi , this . statuses ) ;
2019-01-14 18:16:45 +01:00
lv_status . setAdapter ( statusListAdapter ) ;
}
2019-09-06 17:55:14 +02:00
} else {
2019-01-14 18:16:45 +01:00
BaseMainActivity . displayPeertube = null ;
2019-08-18 17:17:47 +02:00
statusListAdapter = new StatusListAdapter ( type , targetedId , isOnWifi , this . statuses ) ;
2018-12-15 17:13:06 +01:00
lv_status . setAdapter ( statusListAdapter ) ;
}
2019-09-06 17:55:14 +02:00
} else if ( instanceType . equals ( " PEERTUBE " ) ) {
if ( remoteInstance ! = null & & MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PEERTUBE ) //if it's a Peertube account connected
2019-08-19 12:06:21 +02:00
remoteInstance = instance ;
2018-10-20 14:39:24 +02:00
BaseMainActivity . displayPeertube = remoteInstance ;
2019-08-19 09:11:23 +02:00
peertubeAdapater = new PeertubeAdapter ( remoteInstance , ownVideos , this . peertubes ) ;
2018-10-06 15:59:00 +02:00
lv_status . setAdapter ( peertubeAdapater ) ;
2019-09-06 17:55:14 +02:00
} else if ( instanceType . equals ( " PIXELFED " ) ) {
if ( remoteInstance ! = null & & MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PIXELFED ) //if it's a Peertube account connected
2019-08-19 12:06:21 +02:00
remoteInstance = instance ;
2019-08-19 09:11:23 +02:00
pixelfedListAdapter = new PixelfedListAdapter ( type , this . statuses ) ;
2019-01-14 18:16:45 +01:00
lv_status . setAdapter ( pixelfedListAdapter ) ;
2019-09-06 17:55:14 +02:00
} else if ( instanceType . equals ( " ART " ) ) {
if ( type = = RetrieveFeedsAsyncTask . Type . TAG ) {
2019-01-24 09:57:55 +01:00
List < TagTimeline > tagTimelines = new SearchDAO ( context , db ) . getTimelineInfo ( tag ) ;
if ( tagTimelines ! = null & & tagTimelines . size ( ) > 0 ) {
tagTimeline = tagTimelines . get ( 0 ) ;
}
2019-01-24 09:54:26 +01:00
}
2019-08-19 09:11:23 +02:00
artListAdapter = new ArtListAdapter ( this . statuses ) ;
2019-01-14 18:16:45 +01:00
lv_status . setAdapter ( artListAdapter ) ;
2018-10-06 15:59:00 +02:00
}
2017-10-24 14:06:28 +02:00
mLayoutManager = new LinearLayoutManager ( context ) ;
lv_status . setLayoutManager ( mLayoutManager ) ;
2018-01-05 09:46:59 +01:00
2018-01-10 14:39:01 +01:00
2019-01-14 18:16:45 +01:00
//Manage broadcast receiver for Mastodon timelines
2019-09-06 17:55:14 +02:00
if ( MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . MASTODON | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PLEROMA | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . GNU | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . FRIENDICA ) {
if ( receive_action ! = null )
2019-01-10 11:51:25 +01:00
LocalBroadcastManager . getInstance ( context ) . unregisterReceiver ( receive_action ) ;
receive_action = new BroadcastReceiver ( ) {
@Override
public void onReceive ( Context context , Intent intent ) {
Bundle b = intent . getExtras ( ) ;
assert b ! = null ;
Status status = b . getParcelable ( " status " ) ;
2019-07-09 18:08:04 +02:00
String delete_statuses_from = b . getString ( " delete_statuses_for_id " , null ) ;
2019-09-06 17:55:14 +02:00
if ( status ! = null & & statusListAdapter ! = null ) {
2019-03-30 18:48:38 +01:00
statusListAdapter . notifyStatusWithActionChanged ( status ) ;
2019-09-06 17:55:14 +02:00
} else if ( delete_statuses_from ! = null ) {
2019-07-09 18:08:04 +02:00
List < Status > statusesToRemove = new ArrayList < > ( ) ;
2019-09-06 17:55:14 +02:00
for ( Status status_temp : statuses ) {
if ( status_temp . getAccount ( ) . getId ( ) . equals ( delete_statuses_from ) )
2019-07-09 18:08:04 +02:00
statusesToRemove . add ( status ) ;
}
statuses . removeAll ( statusesToRemove ) ;
statusListAdapter . notifyDataSetChanged ( ) ;
2019-01-10 11:51:25 +01:00
}
}
} ;
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_action , new IntentFilter ( Helper . RECEIVE_ACTION ) ) ;
2019-01-11 16:39:01 +01:00
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME | | type = = RetrieveFeedsAsyncTask . Type . LOCAL | | type = = RetrieveFeedsAsyncTask . Type . PUBLIC ) {
2019-01-11 16:39:01 +01:00
if ( receive_data ! = null )
LocalBroadcastManager . getInstance ( context ) . unregisterReceiver ( receive_data ) ;
receive_data = new BroadcastReceiver ( ) {
@Override
public void onReceive ( Context context , Intent intent ) {
Bundle b = intent . getExtras ( ) ;
assert b ! = null ;
String userIdService = b . getString ( " userIdService " , null ) ;
if ( userIdService ! = null & & userIdService . equals ( userId ) ) {
Status status = b . getParcelable ( " data " ) ;
refresh ( status ) ;
}
}
} ;
}
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC )
2019-01-11 16:39:01 +01:00
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_data , new IntentFilter ( Helper . RECEIVE_FEDERATED_DATA ) ) ;
2019-09-29 18:18:20 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME )
2019-01-11 16:39:01 +01:00
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_data , new IntentFilter ( Helper . RECEIVE_HOME_DATA ) ) ;
2019-09-06 17:55:14 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL )
2019-01-11 16:39:01 +01:00
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_data , new IntentFilter ( Helper . RECEIVE_LOCAL_DATA ) ) ;
2019-01-10 11:51:25 +01:00
}
2017-05-26 17:20:36 +02:00
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE & & search_peertube ! = null )
( ( Activity ) context ) . setTitle ( remoteInstance + " - " + search_peertube ) ;
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE & & remote_channel_name ! = null )
( ( Activity ) context ) . setTitle ( remote_channel_name + " - " + remoteInstance ) ;
if ( type ! = RetrieveFeedsAsyncTask . Type . POVERVIEW ) //No paginations for Peertube Overviews (it's a fixed size content
2019-01-14 18:16:45 +01:00
lv_status . addOnScrollListener ( new RecyclerView . OnScrollListener ( ) {
2019-09-06 17:55:14 +02:00
public void onScrolled ( @NonNull RecyclerView recyclerView , int dx , int dy ) {
if ( type ! = RetrieveFeedsAsyncTask . Type . ART & & context instanceof BaseMainActivity ) {
if ( dy < 0 & & ! ( ( BaseMainActivity ) context ) . getFloatingVisibility ( ) )
2019-01-14 18:16:45 +01:00
( ( BaseMainActivity ) context ) . manageFloatingButton ( true ) ;
2019-09-06 17:55:14 +02:00
if ( dy > 0 & & ( ( BaseMainActivity ) context ) . getFloatingVisibility ( ) )
2019-01-14 18:16:45 +01:00
( ( BaseMainActivity ) context ) . manageFloatingButton ( false ) ;
}
int firstVisibleItem = mLayoutManager . findFirstVisibleItemPosition ( ) ;
2019-09-06 17:55:14 +02:00
if ( dy > 0 ) {
2019-01-14 18:16:45 +01:00
int visibleItemCount = mLayoutManager . getChildCount ( ) ;
int totalItemCount = mLayoutManager . getItemCount ( ) ;
2019-09-06 17:55:14 +02:00
if ( firstVisibleItem + visibleItemCount = = totalItemCount & & context ! = null ) {
if ( ! flag_loading ) {
2019-01-14 18:16:45 +01:00
flag_loading = true ;
manageAsyncTask ( true ) ;
nextElementLoader . setVisibility ( View . VISIBLE ) ;
2018-11-20 18:13:22 +01:00
}
2019-01-14 18:16:45 +01:00
} else {
nextElementLoader . setVisibility ( View . GONE ) ;
2017-11-03 10:18:47 +01:00
}
2019-01-14 18:16:45 +01:00
}
2019-09-29 18:18:20 +02:00
if ( ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) & & statuses ! = null & & statuses . size ( ) > firstVisibleItem & & firstVisibleItem > = 0 ) {
2019-01-22 08:51:36 +01:00
Date bookmarkL = statuses . get ( firstVisibleItem ) . getCreated_at ( ) ;
updatedBookMark = statuses . get ( firstVisibleItem ) . getId ( ) ;
updatedBookMarkDate = statuses . get ( firstVisibleItem ) . getCreated_at ( ) ;
2019-09-06 17:55:14 +02:00
if ( lastReadTootDate = = null | | ( bookmarkL ! = null & & bookmarkL . after ( lastReadTootDate ) ) ) {
//Last read toot, only incremented if the id of the toot is greater than the recorded one
2019-01-22 08:51:36 +01:00
lastReadTootDate = bookmarkL ;
2019-01-30 17:04:20 +01:00
}
2017-11-03 10:18:47 +01:00
}
2017-12-09 07:42:46 +01:00
}
2019-01-14 18:16:45 +01:00
} ) ;
2017-11-15 09:44:12 +01:00
2019-09-06 17:55:14 +02:00
if ( instanceType = = null | | ! instanceType . equals ( " PEERTUBE " ) )
2018-10-07 14:48:51 +02:00
swipeRefreshLayout . setOnRefreshListener ( new SwipeRefreshLayout . OnRefreshListener ( ) {
@Override
public void onRefresh ( ) {
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME )
2018-11-23 19:34:44 +01:00
MainActivity . countNewStatus = 0 ;
isSwipped = true ;
2019-09-06 17:55:14 +02:00
if ( type ! = RetrieveFeedsAsyncTask . Type . CONVERSATION )
2018-11-22 17:53:09 +01:00
retrieveMissingToots ( null ) ;
2019-09-06 17:55:14 +02:00
else {
if ( statuses . size ( ) > 0 )
2019-01-26 12:26:55 +01:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
else
retrieveMissingToots ( null ) ;
}
2018-11-23 19:34:44 +01:00
2018-03-16 18:52:43 +01:00
}
2018-10-07 14:48:51 +02:00
} ) ;
2019-06-25 18:29:08 +02:00
else {
2018-10-07 14:48:51 +02:00
swipeRefreshLayout . setOnRefreshListener ( new SwipeRefreshLayout . OnRefreshListener ( ) {
@Override
public void onRefresh ( ) {
2019-06-25 18:29:08 +02:00
if ( peertubes . size ( ) > 0 ) {
2018-10-07 14:48:51 +02:00
int size = peertubes . size ( ) ;
isSwipped = true ;
peertubes . clear ( ) ;
peertubes = new ArrayList < > ( ) ;
max_id = " 0 " ;
peertubeAdapater . notifyItemRangeRemoved ( 0 , size ) ;
2019-06-25 18:29:08 +02:00
if ( search_peertube = = null ) { //Not a Peertube search
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , remoteInstance , " 0 " , DisplayStatusFragment . this ) . execute ( ) ;
2019-06-25 18:29:08 +02:00
} else {
2019-09-15 17:43:42 +02:00
asyncTask = new RetrievePeertubeSearchAsyncTask ( context , remoteInstance , search_peertube , DisplayStatusFragment . this ) . execute ( ) ;
2019-06-25 18:29:08 +02:00
}
2018-10-07 14:48:51 +02:00
}
}
} ) ;
2019-06-25 18:29:08 +02:00
}
2019-09-06 17:55:14 +02:00
if ( context ! = null ) {
2019-01-14 18:16:45 +01:00
//Load data depending of the value
manageAsyncTask ( false ) ;
2019-09-06 17:55:14 +02:00
} else {
2017-11-15 09:44:12 +01:00
new Handler ( Looper . getMainLooper ( ) ) . postDelayed ( new Runnable ( ) {
@Override
public void run ( ) {
2019-09-06 17:55:14 +02:00
if ( context ! = null ) {
2019-01-14 18:16:45 +01:00
manageAsyncTask ( false ) ;
2017-11-15 09:44:12 +01:00
}
}
} , 500 ) ;
2017-05-26 17:20:36 +02:00
}
2017-05-05 16:36:04 +02:00
return rootView ;
}
2018-12-19 15:12:46 +01:00
@Override
2019-09-06 17:55:14 +02:00
public void onPause ( ) {
2018-12-19 15:12:46 +01:00
super . onPause ( ) ;
2019-09-06 17:55:14 +02:00
if ( swipeRefreshLayout ! = null ) {
2019-08-18 12:56:24 +02:00
swipeRefreshLayout . setEnabled ( false ) ;
swipeRefreshLayout . setRefreshing ( false ) ;
swipeRefreshLayout . clearAnimation ( ) ;
}
2018-12-19 15:12:46 +01:00
//Store bookmark on pause
2019-09-29 18:18:20 +02:00
if ( context instanceof BaseMainActivity & & ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) ) {
2018-12-19 15:12:46 +01:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2019-09-06 17:55:14 +02:00
if ( updatedBookMark ! = null )
2018-12-19 15:12:46 +01:00
editor . putString ( Helper . BOOKMARK_ID + userId + instance , updatedBookMark ) ;
2019-09-06 17:55:14 +02:00
if ( updatedBookMarkDate ! = null )
2019-01-22 08:51:36 +01:00
editor . putString ( Helper . BOOKMARK_DATE + userId + instance , Helper . dateToString ( updatedBookMarkDate ) ) ;
2019-09-06 17:55:14 +02:00
if ( lastReadToot ! = null )
2018-12-19 15:12:46 +01:00
editor . putString ( Helper . LAST_READ_TOOT_ID + userId + instance , lastReadToot ) ;
2019-09-06 17:55:14 +02:00
if ( lastReadTootDate ! = null )
2019-01-30 17:04:20 +01:00
editor . putString ( Helper . LAST_READ_TOOT_DATE + userId + instance , Helper . dateToString ( lastReadTootDate ) ) ;
editor . apply ( ) ;
2018-12-19 15:12:46 +01:00
}
}
2017-05-05 16:36:04 +02:00
@Override
2019-09-06 17:55:14 +02:00
public void onCreate ( Bundle saveInstance ) {
2017-05-05 16:36:04 +02:00
super . onCreate ( saveInstance ) ;
}
@Override
public void onAttach ( Context context ) {
super . onAttach ( context ) ;
this . context = context ;
}
2019-08-17 11:10:31 +02:00
@Override
2019-09-06 17:55:14 +02:00
public void onStop ( ) {
2019-08-17 11:10:31 +02:00
super . onStop ( ) ;
2019-09-06 17:55:14 +02:00
if ( statusListAdapter ! = null ) {
2019-08-17 11:10:31 +02:00
statusListAdapter . storeToot ( ) ;
}
/ * if ( asyncTask ! = null & & ! asyncTask . isCancelled ( ) ) {
asyncTask . cancel ( true ) ;
} * /
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC & & streamingFederatedIntent ! = null ) {
2019-08-17 11:10:31 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_FEDERATED + userId + instance , false ) ;
editor . apply ( ) ;
context . stopService ( streamingFederatedIntent ) ;
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL & & streamingLocalIntent ! = null ) {
2019-08-17 11:10:31 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_LOCAL + userId + instance , false ) ;
editor . apply ( ) ;
context . stopService ( streamingLocalIntent ) ;
}
}
2017-07-05 13:12:50 +02:00
@Override
2019-09-06 17:55:14 +02:00
public void onDestroy ( ) {
2017-07-05 13:12:50 +02:00
super . onDestroy ( ) ;
2019-09-06 17:55:14 +02:00
if ( asyncTask ! = null & & asyncTask . getStatus ( ) = = AsyncTask . Status . RUNNING )
2017-05-05 16:36:04 +02:00
asyncTask . cancel ( true ) ;
2019-09-06 17:55:14 +02:00
if ( receive_action ! = null )
2019-01-10 11:51:25 +01:00
LocalBroadcastManager . getInstance ( context ) . unregisterReceiver ( receive_action ) ;
2019-09-06 17:55:14 +02:00
if ( receive_data ! = null )
2019-01-11 16:39:01 +01:00
LocalBroadcastManager . getInstance ( context ) . unregisterReceiver ( receive_data ) ;
2017-05-05 16:36:04 +02:00
}
@Override
2017-09-29 16:10:11 +02:00
public void onRetrieveFeeds ( APIResponse apiResponse ) {
2018-12-19 15:12:46 +01:00
//hide loaders
2017-05-30 19:31:44 +02:00
mainLoader . setVisibility ( View . GONE ) ;
nextElementLoader . setVisibility ( View . GONE ) ;
2019-02-27 09:54:38 +01:00
2018-12-19 15:12:46 +01:00
//handle other API error but discards 404 - error which can often happen due to toots which have been deleted
2019-09-06 17:55:14 +02:00
if ( this . peertubes = = null | | this . statuses = = null | | apiResponse = = null | | ( apiResponse . getError ( ) ! = null & & apiResponse . getError ( ) . getStatusCode ( ) ! = 404 ) ) {
if ( apiResponse = = null )
Toasty . error ( context , context . getString ( R . string . toast_error ) , Toast . LENGTH_LONG ) . show ( ) ;
2019-09-30 18:14:46 +02:00
else {
if ( apiResponse . getError ( ) . getError ( ) . length ( ) < 100 ) {
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , Toast . LENGTH_LONG ) . show ( ) ;
} else {
Toasty . error ( context , getString ( R . string . long_api_error , " \ ud83d \ ude05 " ) , Toast . LENGTH_LONG ) . show ( ) ;
}
}
2017-06-17 07:49:47 +02:00
swipeRefreshLayout . setRefreshing ( false ) ;
2017-08-19 19:10:43 +02:00
flag_loading = false ;
2017-05-30 19:31:44 +02:00
return ;
}
2019-02-27 09:54:38 +01:00
2018-12-19 15:12:46 +01:00
//For remote Peertube remote instances
2019-09-06 17:55:14 +02:00
if ( instanceType . equals ( " PEERTUBE " ) ) {
2018-10-07 10:45:34 +02:00
int previousPosition = this . peertubes . size ( ) ;
2019-09-06 17:55:14 +02:00
if ( max_id = = null )
2018-10-07 10:45:34 +02:00
max_id = " 0 " ;
2018-12-19 15:12:46 +01:00
//max_id needs to work like an offset
2019-08-31 16:41:29 +02:00
int tootPerPage = sharedpreferences . getInt ( Helper . SET_TOOT_PER_PAGE , Helper . TOOTS_PER_PAGE ) ;
2019-05-26 12:04:00 +02:00
max_id = String . valueOf ( Integer . valueOf ( max_id ) + tootPerPage ) ;
2019-09-06 17:55:14 +02:00
if ( apiResponse . getPeertubes ( ) = = null ) {
2019-01-10 16:05:48 +01:00
return ;
}
2018-10-07 10:45:34 +02:00
this . peertubes . addAll ( apiResponse . getPeertubes ( ) ) ;
2018-12-19 15:12:46 +01:00
//If no item were inserted previously the adapter is created
2019-09-06 17:55:14 +02:00
if ( previousPosition = = 0 ) {
2019-08-19 09:11:23 +02:00
peertubeAdapater = new PeertubeAdapter ( remoteInstance , ownVideos , this . peertubes ) ;
2018-10-07 14:48:51 +02:00
lv_status . setAdapter ( peertubeAdapater ) ;
2019-09-06 17:55:14 +02:00
} else
2018-10-07 14:48:51 +02:00
peertubeAdapater . notifyItemRangeInserted ( previousPosition , apiResponse . getPeertubes ( ) . size ( ) ) ;
2018-12-19 15:12:46 +01:00
//remove handlers
2018-10-07 10:45:34 +02:00
swipeRefreshLayout . setRefreshing ( false ) ;
2019-09-06 17:55:14 +02:00
if ( firstLoad & & ( apiResponse . getPeertubes ( ) = = null | | apiResponse . getPeertubes ( ) . size ( ) = = 0 ) ) {
2019-01-15 11:00:54 +01:00
textviewNoActionText . setText ( R . string . no_video_to_display ) ;
2019-01-12 17:55:18 +01:00
textviewNoAction . setVisibility ( View . VISIBLE ) ;
}
2018-10-07 11:57:15 +02:00
flag_loading = false ;
2019-01-12 17:55:18 +01:00
firstLoad = false ;
2019-09-06 17:55:14 +02:00
} else {
2019-01-14 19:27:15 +01:00
2018-12-19 15:12:46 +01:00
//When Mastodon statuses have been fetched.
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) { //Conversation timeline
2018-12-19 15:12:46 +01:00
//this timeline is dealt differently because it is embedded in Conversation entity and not directly in statuses
2018-10-29 15:49:13 +01:00
List < Conversation > conversations = apiResponse . getConversations ( ) ;
2018-12-19 15:12:46 +01:00
//Statuses from conversation entity are retrieved
2018-10-29 15:49:13 +01:00
List < Status > statusesConversations = new ArrayList < > ( ) ;
2019-09-06 17:55:14 +02:00
if ( conversations ! = null ) {
2018-11-22 07:47:43 +01:00
for ( Conversation conversation : conversations ) {
2019-08-07 09:14:20 +02:00
Status status = conversation . getLast_status ( ) ;
if ( status ! = null ) {
status . setConversationId ( conversation . getId ( ) ) ;
List < String > ppConversation = new ArrayList < > ( ) ;
for ( Account account : conversation . getAccounts ( ) )
ppConversation . add ( account . getAvatar ( ) ) ;
status . setConversationProfilePicture ( ppConversation ) ;
statusesConversations . add ( status ) ;
2018-11-22 07:47:43 +01:00
}
}
2018-10-29 18:32:55 +01:00
}
2018-10-29 15:49:13 +01:00
apiResponse . setStatuses ( statusesConversations ) ;
}
2018-10-07 11:57:15 +02:00
int previousPosition = this . statuses . size ( ) ;
2019-03-31 14:25:40 +02:00
List < Status > statuses ;
2019-09-06 17:55:14 +02:00
if ( apiResponse . getResults ( ) ! = null & & apiResponse . getResults ( ) . getStatuses ( ) ! = null )
2019-03-31 14:25:40 +02:00
statuses = apiResponse . getResults ( ) . getStatuses ( ) ;
else
statuses = apiResponse . getStatuses ( ) ;
2018-12-19 15:12:46 +01:00
//At this point all statuses are in "List<Status> statuses"
2018-12-26 15:43:36 +01:00
//Pagination for Pixelfed
2019-09-06 17:55:14 +02:00
if ( instanceType . equals ( " PIXELFED " ) ) {
if ( max_id = = null )
2018-12-26 15:43:36 +01:00
max_id = " 1 " ;
//max_id needs to work like an offset
max_id = String . valueOf ( Integer . valueOf ( max_id ) + 1 ) ;
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . SEARCH & & ! tag . contains ( " _cache_ " ) ) {
if ( max_id = = null )
2019-03-31 15:15:46 +02:00
max_id = " 0 " ;
max_id = String . valueOf ( Integer . valueOf ( max_id ) + 20 ) ;
2019-09-06 17:55:14 +02:00
} else {
2018-12-26 15:43:36 +01:00
max_id = apiResponse . getMax_id ( ) ;
}
2019-03-31 15:15:46 +02:00
2018-12-19 15:12:46 +01:00
//while max_id is different from null, there are some more toots to load when scrolling
2019-09-06 17:55:14 +02:00
flag_loading = ( max_id = = null ) ;
2018-12-19 15:12:46 +01:00
//If it's the first load and the reply doesn't contain any toots, a message is displayed.
2019-09-06 17:55:14 +02:00
if ( firstLoad & & ( statuses = = null | | statuses . size ( ) = = 0 ) ) {
2018-10-07 11:57:15 +02:00
textviewNoAction . setVisibility ( View . VISIBLE ) ;
2018-12-19 15:12:46 +01:00
lv_status . setVisibility ( View . GONE ) ;
2019-09-06 17:55:14 +02:00
} else {
2018-12-19 15:12:46 +01:00
lv_status . setVisibility ( View . VISIBLE ) ;
2018-10-07 11:57:15 +02:00
textviewNoAction . setVisibility ( View . GONE ) ;
2018-12-19 15:12:46 +01:00
}
2018-10-07 11:57:15 +02:00
//First toot are loaded as soon as the bookmark has been retrieved
2018-12-19 15:12:46 +01:00
//Only for the Home timeline
2019-09-29 18:18:20 +02:00
if ( ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) & & ! firstTootsLoaded ) {
2019-05-25 18:58:31 +02:00
boolean remember_position_home = sharedpreferences . getBoolean ( Helper . SET_REMEMBER_POSITION_HOME , true ) ;
2019-09-06 17:55:14 +02:00
if ( remember_position_home )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . execute ( ) ;
2018-10-07 11:57:15 +02:00
firstTootsLoaded = true ;
}
2018-12-19 15:12:46 +01:00
//Let's deal with statuses
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
if ( statusListAdapter ! = null & & ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) ) {
2019-01-14 19:27:15 +01:00
this . statuses . addAll ( statuses ) ;
statusListAdapter . notifyItemRangeInserted ( previousPosition , statuses . size ( ) ) ;
2019-09-06 17:55:14 +02:00
} else if ( artListAdapter ! = null & & instanceType . equals ( " ART " ) ) {
2018-12-31 17:30:51 +01:00
boolean show_nsfw = sharedpreferences . getBoolean ( Helper . SET_ART_WITH_NSFW , false ) ;
2019-09-06 17:55:14 +02:00
if ( ! show_nsfw ) {
2018-12-31 17:30:51 +01:00
ArrayList < Status > safeStatuses = new ArrayList < > ( ) ;
2019-09-06 17:55:14 +02:00
for ( Status status : statuses ) {
if ( ! status . isSensitive ( ) )
2018-12-31 17:30:51 +01:00
safeStatuses . add ( status ) ;
}
this . statuses . addAll ( safeStatuses ) ;
2019-01-14 19:27:15 +01:00
artListAdapter . notifyItemRangeInserted ( previousPosition , safeStatuses . size ( ) ) ;
2019-09-06 17:55:14 +02:00
} else {
2018-12-15 17:13:06 +01:00
this . statuses . addAll ( statuses ) ;
2019-01-14 19:27:15 +01:00
artListAdapter . notifyItemRangeInserted ( previousPosition , statuses . size ( ) ) ;
2018-12-15 17:13:06 +01:00
}
2019-01-21 18:49:02 +01:00
2019-09-06 17:55:14 +02:00
} else if ( pixelfedListAdapter ! = null & & instanceType . equals ( " PIXELFED " ) ) {
2019-01-14 19:27:15 +01:00
this . statuses . addAll ( statuses ) ;
pixelfedListAdapter . notifyItemRangeInserted ( previousPosition , statuses . size ( ) ) ;
2018-10-07 11:57:15 +02:00
}
2017-09-24 18:44:42 +02:00
}
2018-10-07 11:57:15 +02:00
swipeRefreshLayout . setRefreshing ( false ) ;
firstLoad = false ;
2017-10-28 10:10:50 +02:00
2018-10-07 11:57:15 +02:00
}
2017-05-05 16:36:04 +02:00
}
2017-08-17 15:48:36 +02:00
2017-09-27 17:52:23 +02:00
/ * *
* Deals with new status coming from the streaming api
2019-09-06 17:55:14 +02:00
*
2017-09-27 17:52:23 +02:00
* @param status Status
* /
2019-09-06 17:55:14 +02:00
public void refresh ( Status status ) {
2017-09-06 15:26:58 +02:00
//New data are available
2017-11-15 09:44:12 +01:00
if ( context = = null )
return ;
2019-09-06 17:55:14 +02:00
if ( status . getId ( ) ! = null & & statuses ! = null & & statuses . size ( ) > 0 & & statuses . get ( 0 ) ! = null
& & status . getCreated_at ( ) . after ( statuses . get ( 0 ) . getCreated_at ( ) ) ) {
2018-11-10 08:52:17 +01:00
List < Status > tempTootResult = new ArrayList ( ) ;
tempTootResult . add ( status ) ;
2019-09-06 17:55:14 +02:00
if ( tempTootResult . size ( ) > 0 )
2018-09-26 13:45:13 +02:00
status = tempTootResult . get ( 0 ) ;
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2017-11-15 09:44:12 +01:00
2017-12-28 15:33:02 +01:00
//Makes sure the status is not already displayed
2019-09-06 17:55:14 +02:00
if ( ! statuses . contains ( status ) ) {
2017-12-28 15:33:02 +01:00
//Update the id of the last toot retrieved
MainActivity . lastHomeId = status . getId ( ) ;
statuses . add ( 0 , status ) ;
2019-08-17 19:07:35 +02:00
statusListAdapter . notifyItemInserted ( 0 ) ;
2018-12-19 15:12:46 +01:00
try {
( ( MainActivity ) context ) . updateHomeCounter ( ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2019-01-14 18:32:59 +01:00
2017-12-28 15:33:02 +01:00
}
2017-11-15 09:44:12 +01:00
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC | | type = = RetrieveFeedsAsyncTask . Type . LOCAL | | type = = RetrieveFeedsAsyncTask . Type . DIRECT | | type = = RetrieveFeedsAsyncTask . Type . GNU_DM ) {
2017-11-15 09:44:12 +01:00
2017-10-21 19:19:11 +02:00
status . setNew ( false ) ;
2017-10-24 11:03:36 +02:00
statuses . add ( 0 , status ) ;
2017-10-24 14:06:28 +02:00
int firstVisibleItem = mLayoutManager . findFirstVisibleItemPosition ( ) ;
2017-11-15 09:44:12 +01:00
if ( firstVisibleItem > 0 )
2017-10-24 14:06:28 +02:00
statusListAdapter . notifyItemInserted ( 0 ) ;
else
statusListAdapter . notifyDataSetChanged ( ) ;
2017-09-26 19:19:53 +02:00
if ( textviewNoAction . getVisibility ( ) = = View . VISIBLE )
textviewNoAction . setVisibility ( View . GONE ) ;
2017-11-15 09:44:12 +01:00
2017-09-26 19:19:53 +02:00
}
2017-08-28 19:12:40 +02:00
}
}
2017-10-11 09:23:32 +02:00
2019-08-18 17:17:47 +02:00
@Override
public void onDestroyView ( ) {
2019-09-06 17:55:14 +02:00
if ( lv_status ! = null ) {
2019-10-20 18:03:10 +02:00
try {
lv_status . setAdapter ( null ) ;
} catch ( Exception ignored ) { }
2019-08-18 17:17:47 +02:00
}
super . onDestroyView ( ) ;
}
2017-09-29 16:10:11 +02:00
@Override
2019-09-06 17:55:14 +02:00
public void onResume ( ) {
2017-09-29 16:10:11 +02:00
super . onResume ( ) ;
2019-08-17 19:17:48 +02:00
swipeRefreshLayout . setEnabled ( true ) ;
2017-12-29 11:21:24 +01:00
boolean liveNotifications = sharedpreferences . getBoolean ( Helper . SET_LIVE_NOTIFICATIONS , true ) ;
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2019-09-06 17:55:14 +02:00
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 & & asyncTask . getStatus ( ) ! = AsyncTask . Status . RUNNING ) {
2018-12-19 10:54:26 +01:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2019-02-06 17:53:49 +01:00
}
2018-12-19 10:54:26 +01:00
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC ) {
if ( getUserVisibleHint ( ) ) {
2017-09-29 16:22:36 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_FEDERATED + userId + instance , true ) ;
2017-09-29 16:22:36 +02:00
editor . apply ( ) ;
2019-09-06 17:55:14 +02:00
if ( liveNotifications ) {
2017-12-29 11:21:24 +01:00
streamingFederatedIntent = new Intent ( context , StreamingFederatedTimelineService . class ) ;
2018-09-04 07:29:42 +02:00
try {
context . startService ( streamingFederatedIntent ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2017-12-29 11:21:24 +01:00
}
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
2017-10-07 08:34:50 +02:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-29 16:22:36 +02:00
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL ) {
2017-09-30 10:57:14 +02:00
2019-09-06 17:55:14 +02:00
if ( getUserVisibleHint ( ) ) {
2017-09-30 09:00:00 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_LOCAL + userId + instance , true ) ;
2017-09-30 09:00:00 +02:00
editor . apply ( ) ;
2019-09-06 17:55:14 +02:00
if ( liveNotifications ) {
2017-12-29 11:21:24 +01:00
streamingLocalIntent = new Intent ( context , StreamingLocalTimelineService . class ) ;
2018-09-04 07:29:42 +02:00
try {
context . startService ( streamingLocalIntent ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2017-12-29 11:21:24 +01:00
}
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
2017-10-07 08:34:50 +02:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-30 09:00:00 +02:00
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . DIRECT | | type = = RetrieveFeedsAsyncTask . Type . GNU_DM ) {
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
2018-10-26 17:00:38 +02:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) {
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
2018-11-18 17:24:12 +01:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . TAG ) {
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
2018-11-21 18:04:10 +01:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
}
2017-09-29 16:10:11 +02:00
}
}
2017-09-26 19:19:53 +02:00
2017-09-27 17:52:23 +02:00
/ * *
* Called from main activity in onResume to retrieve missing toots ( home timeline )
2019-09-06 17:55:14 +02:00
*
2017-09-27 17:52:23 +02:00
* @param sinceId String
* /
2019-09-06 17:55:14 +02:00
private void retrieveMissingToots ( String sinceId ) {
2018-12-23 10:43:45 +01:00
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , remoteInstance , sinceId , type , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . TAG )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , tag , sinceId , type , DisplayStatusFragment . this ) . execute ( ) ;
2018-08-24 15:47:16 +02:00
else
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , sinceId , type , DisplayStatusFragment . this ) . execute ( ) ;
2018-08-24 15:47:16 +02:00
2017-09-27 17:52:23 +02:00
}
2019-05-09 19:03:02 +02:00
2019-09-06 17:55:14 +02:00
public void retrieveMissingHome ( ) {
if ( statusListAdapter ! = null & & statuses ! = null & & lv_status ! = null & & mLayoutManager ! = null ) {
2019-05-09 19:03:02 +02:00
int firstVisible = mLayoutManager . findFirstVisibleItemPosition ( ) ;
Iterator < Status > s = statuses . iterator ( ) ;
int i = 0 ;
while ( s . hasNext ( ) & & i < firstVisible ) {
Status status = s . next ( ) ;
s . remove ( ) ;
statusListAdapter . notifyItemRemoved ( 0 ) ;
statusListAdapter . notifyItemChanged ( 0 ) ;
i + + ;
}
2019-09-06 17:55:14 +02:00
if ( statuses . size ( ) > 0 )
2019-05-13 07:21:09 +02:00
initialBookMarkDate = statuses . get ( 0 ) . getCreated_at ( ) ;
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . execute ( ) ;
2019-05-09 19:03:02 +02:00
}
}
2017-09-27 17:52:23 +02:00
/ * *
* When tab comes visible , first displayed toot is defined as read
2019-09-06 17:55:14 +02:00
*
2017-09-27 17:52:23 +02:00
* @param visible boolean
* /
2017-09-13 15:21:03 +02:00
@Override
public void setMenuVisibility ( final boolean visible ) {
super . setMenuVisibility ( visible ) ;
2019-09-06 17:55:14 +02:00
if ( context = = null )
2017-09-13 15:21:03 +02:00
return ;
2019-09-14 18:53:23 +02:00
int liveNotifications = Helper . liveNotifType ( context ) ;
2017-09-13 15:21:03 +02:00
//Store last toot id for home timeline to avoid to notify for those that have been already seen
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2018-12-19 10:54:26 +01:00
if ( visible ) {
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
2018-12-19 10:54:26 +01:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2019-02-06 17:53:49 +01:00
}
2018-12-19 10:54:26 +01:00
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC ) {
2017-09-29 07:19:30 +02:00
if ( visible ) {
2017-09-29 14:08:46 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_FEDERATED + userId + instance , true ) ;
2017-09-29 14:08:46 +02:00
editor . apply ( ) ;
2019-09-14 18:53:23 +02:00
if ( liveNotifications ! = 2 ) {
2017-12-29 11:21:24 +01:00
streamingFederatedIntent = new Intent ( context , StreamingFederatedTimelineService . class ) ;
2018-09-04 07:29:42 +02:00
try {
context . startService ( streamingFederatedIntent ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2017-12-29 11:21:24 +01:00
}
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
2017-10-07 08:34:50 +02:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2019-09-06 17:55:14 +02:00
} else {
if ( streamingFederatedIntent ! = null ) {
2017-09-29 14:08:46 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_FEDERATED + userId + instance , false ) ;
2017-09-29 14:08:46 +02:00
editor . apply ( ) ;
2017-09-30 08:29:39 +02:00
context . stopService ( streamingFederatedIntent ) ;
2017-09-29 07:19:30 +02:00
}
}
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL ) {
2017-09-30 09:00:00 +02:00
if ( visible ) {
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_LOCAL + userId + instance , true ) ;
2017-09-30 09:00:00 +02:00
editor . apply ( ) ;
2019-09-14 18:53:23 +02:00
if ( liveNotifications ! = 2 ) {
2017-12-29 11:21:24 +01:00
streamingLocalIntent = new Intent ( context , StreamingLocalTimelineService . class ) ;
2018-09-04 07:29:42 +02:00
try {
context . startService ( streamingLocalIntent ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2017-12-29 11:21:24 +01:00
}
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
2017-10-07 08:34:50 +02:00
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2019-09-06 17:55:14 +02:00
} else {
if ( streamingLocalIntent ! = null ) {
2017-09-30 09:00:00 +02:00
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
2017-12-28 17:39:02 +01:00
editor . putBoolean ( Helper . SHOULD_CONTINUE_STREAMING_LOCAL + userId + instance , false ) ;
2017-09-30 09:00:00 +02:00
editor . apply ( ) ;
context . stopService ( streamingLocalIntent ) ;
}
}
2017-09-29 07:19:30 +02:00
}
2017-09-13 15:21:03 +02:00
}
2019-08-17 11:10:31 +02:00
2019-09-06 17:55:14 +02:00
public void scrollToTop ( ) {
if ( lv_status ! = null & & instanceType ! = null ) {
if ( statusListAdapter ! = null & & ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) )
2019-01-21 18:49:02 +01:00
lv_status . setAdapter ( statusListAdapter ) ;
2019-09-06 17:55:14 +02:00
else if ( pixelfedListAdapter ! = null & & instanceType . equals ( " PIXELFED " ) )
2019-01-21 18:49:02 +01:00
lv_status . setAdapter ( pixelfedListAdapter ) ;
2019-09-06 17:55:14 +02:00
else if ( artListAdapter ! = null & & instanceType . equals ( " ART " ) )
2019-01-21 18:49:02 +01:00
lv_status . setAdapter ( artListAdapter ) ;
2019-09-06 17:55:14 +02:00
else if ( peertubeAdapater ! = null & & instanceType . equals ( " PEERTUBE " ) )
2019-01-30 17:39:10 +01:00
lv_status . setAdapter ( peertubeAdapater ) ;
2017-09-16 09:56:26 +02:00
}
2017-08-17 15:48:36 +02:00
}
2017-08-18 17:50:54 +02:00
2018-11-10 08:52:17 +01:00
/ * *
* Refresh status in list
* /
2019-09-06 17:55:14 +02:00
public void refreshFilter ( ) {
2019-01-14 19:27:15 +01:00
2019-09-06 17:55:14 +02:00
if ( statusListAdapter ! = null ) {
2019-08-18 19:04:16 +02:00
statusListAdapter . notifyDataSetChanged ( ) ;
2019-09-06 17:55:14 +02:00
} else if ( pixelfedListAdapter ! = null ) {
2019-08-18 19:04:16 +02:00
pixelfedListAdapter . notifyDataSetChanged ( ) ;
2019-09-06 17:55:14 +02:00
} else if ( artListAdapter ! = null ) {
2019-08-18 19:04:16 +02:00
artListAdapter . notifyDataSetChanged ( ) ;
2019-08-18 17:17:47 +02:00
}
2018-11-10 08:52:17 +01:00
}
2017-09-27 17:52:23 +02:00
@Override
2018-11-10 08:52:17 +01:00
public void onRetrieveMissingFeeds ( List < Status > statuses ) {
2019-09-06 17:55:14 +02:00
if ( swipeRefreshLayout = = null )
2018-11-04 10:01:16 +01:00
return ;
2019-05-22 17:33:52 +02:00
//Clean label new
2018-03-10 12:18:31 +01:00
swipeRefreshLayout . setRefreshing ( false ) ;
2019-09-06 17:55:14 +02:00
if ( isSwipped & & this . statuses ! = null & & this . statuses . size ( ) > 0 ) {
2018-04-23 17:53:37 +02:00
for ( Status status : this . statuses ) {
status . setNew ( false ) ;
}
2019-05-22 17:33:52 +02:00
switch ( instanceType ) {
case " MASTODON " :
case " MISSKEY " :
case " GNU " :
statusListAdapter . notifyItemRangeChanged ( 0 , this . statuses . size ( ) ) ;
break ;
case " PIXELFED " :
pixelfedListAdapter . notifyItemRangeChanged ( 0 , this . statuses . size ( ) ) ;
break ;
case " ART " :
artListAdapter . notifyItemRangeChanged ( 0 , this . statuses . size ( ) ) ;
break ;
}
2018-04-23 17:53:37 +02:00
}
2019-05-22 17:33:52 +02:00
2018-04-25 14:03:15 +02:00
isSwipped = false ;
2019-01-26 12:26:55 +01:00
2019-09-06 17:55:14 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
if ( textviewNoAction . getVisibility ( ) = = View . VISIBLE ) {
2019-01-26 12:26:55 +01:00
textviewNoAction . setVisibility ( View . GONE ) ;
lv_status . setVisibility ( View . VISIBLE ) ;
}
2017-10-24 14:06:28 +02:00
int inserted = 0 ;
2018-11-22 19:15:31 +01:00
int insertedConversation = 0 ;
2019-09-06 17:55:14 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) { //Remove conversation already displayed if new messages
2018-11-21 18:04:10 +01:00
int position = 0 ;
2018-11-23 19:34:44 +01:00
insertedConversation = statuses . size ( ) ;
2019-09-06 17:55:14 +02:00
if ( this . statuses ! = null ) {
2018-11-21 18:04:10 +01:00
for ( Iterator < Status > it = this . statuses . iterator ( ) ; it . hasNext ( ) ; ) {
Status status = it . next ( ) ;
for ( Status status1 : statuses ) {
if ( status . getConversationId ( ) ! = null & & status . getConversationId ( ) . equals ( status1 . getConversationId ( ) ) ) {
2019-09-06 17:55:14 +02:00
if ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) )
2019-01-14 19:27:15 +01:00
statusListAdapter . notifyItemRemoved ( position ) ;
2019-09-06 17:55:14 +02:00
else if ( instanceType . equals ( " PIXELFED " ) )
2019-01-14 19:27:15 +01:00
pixelfedListAdapter . notifyItemRemoved ( position ) ;
2019-09-06 17:55:14 +02:00
else if ( instanceType . equals ( " ART " ) )
2019-01-14 19:27:15 +01:00
artListAdapter . notifyItemRemoved ( position ) ;
2018-11-21 18:04:10 +01:00
it . remove ( ) ;
}
}
position + + ;
}
}
}
2017-10-24 11:03:36 +02:00
for ( int i = statuses . size ( ) - 1 ; i > = 0 ; i - - ) {
2019-09-06 17:55:14 +02:00
if ( this . statuses ! = null ) {
2019-09-29 18:18:20 +02:00
if ( type ! = RetrieveFeedsAsyncTask . Type . HOME & & type ! = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2019-09-06 17:55:14 +02:00
if ( tagTimeline ! = null & & instanceType . equals ( " ART " ) & & ! tagTimeline . isNSFW ( ) ) {
if ( ! statuses . get ( i ) . isSensitive ( ) ) {
2019-01-24 09:54:26 +01:00
this . statuses . add ( 0 , statuses . get ( i ) ) ;
inserted + + ;
}
2019-09-06 17:55:14 +02:00
} else {
2019-01-22 08:51:36 +01:00
if ( this . statuses . size ( ) = = 0 | | statuses . get ( i ) . getCreated_at ( ) . after ( this . statuses . get ( 0 ) . getCreated_at ( ) ) ) {
2018-12-28 12:09:06 +01:00
inserted + + ;
this . statuses . add ( 0 , statuses . get ( i ) ) ;
}
2018-12-27 17:49:50 +01:00
}
2019-09-06 17:55:14 +02:00
} else {
if ( lastReadTootDate ! = null & & statuses . get ( i ) . getCreated_at ( ) . after ( lastReadTootDate ) ) {
if ( ! this . statuses . contains ( statuses . get ( i ) ) ) {
2018-12-28 15:21:36 +01:00
statuses . get ( i ) . setNew ( true ) ;
MainActivity . countNewStatus + + ;
inserted + + ;
this . statuses . add ( 0 , statuses . get ( i ) ) ;
}
2018-12-22 11:08:04 +01:00
}
2018-09-26 13:45:13 +02:00
}
2017-10-07 13:00:08 +02:00
}
2017-09-27 17:52:23 +02:00
}
2019-09-06 17:55:14 +02:00
if ( statusListAdapter ! = null & & ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) )
2019-01-14 19:27:15 +01:00
statusListAdapter . notifyItemRangeInserted ( 0 , inserted ) ;
2019-09-06 17:55:14 +02:00
else if ( pixelfedListAdapter ! = null & & instanceType . equals ( " PIXELFED " ) )
2019-01-14 19:27:15 +01:00
pixelfedListAdapter . notifyItemRangeInserted ( 0 , inserted ) ;
2019-09-06 17:55:14 +02:00
else if ( artListAdapter ! = null & & instanceType . equals ( " ART " ) )
2019-01-14 19:27:15 +01:00
artListAdapter . notifyItemRangeInserted ( 0 , inserted ) ;
2017-09-27 17:52:23 +02:00
try {
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME )
2017-10-25 13:45:22 +02:00
( ( MainActivity ) context ) . updateHomeCounter ( ) ;
2018-11-22 19:15:31 +01:00
else {
2019-09-06 17:55:14 +02:00
if ( type ! = RetrieveFeedsAsyncTask . Type . CONVERSATION )
2019-04-21 09:12:10 +02:00
( ( MainActivity ) context ) . manageTab ( type , inserted ) ;
2018-11-22 19:15:31 +01:00
else
2019-04-21 09:12:10 +02:00
( ( MainActivity ) context ) . manageTab ( type , insertedConversation ) ;
2018-11-22 19:15:31 +01:00
}
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2017-09-27 17:52:23 +02:00
}
}
2017-12-06 16:56:59 +01:00
2019-09-06 17:55:14 +02:00
public void fetchMore ( String max_id ) {
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , max_id , true , DisplayStatusFragment . this ) . execute ( ) ;
2018-12-21 18:49:02 +01:00
}
@Override
public void onRetrieveFeedsAfterBookmark ( APIResponse apiResponse ) {
2019-05-25 18:58:31 +02:00
2019-09-29 18:18:20 +02:00
if ( statusListAdapter = = null & & pixelfedListAdapter = = null )
2019-02-06 17:53:49 +01:00
return ;
2019-09-06 17:55:14 +02:00
if ( apiResponse = = null | | ( apiResponse . getError ( ) ! = null & & apiResponse . getError ( ) . getStatusCode ( ) ! = 404 ) ) {
if ( apiResponse = = null )
Toasty . error ( context , context . getString ( R . string . toast_error ) , Toast . LENGTH_LONG ) . show ( ) ;
2018-12-21 18:49:02 +01:00
else
2019-09-30 18:14:46 +02:00
if ( apiResponse . getError ( ) . getError ( ) . length ( ) < 100 ) {
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , Toast . LENGTH_LONG ) . show ( ) ;
} else {
Toasty . error ( context , getString ( R . string . long_api_error , " \ ud83d \ ude05 " ) , Toast . LENGTH_LONG ) . show ( ) ;
}
2018-12-21 18:49:02 +01:00
swipeRefreshLayout . setRefreshing ( false ) ;
flag_loading = false ;
return ;
}
List < Status > statuses = apiResponse . getStatuses ( ) ;
2019-05-25 18:58:31 +02:00
2019-09-06 17:55:14 +02:00
if ( statuses = = null | | statuses . size ( ) = = 0 | | this . statuses = = null )
2018-12-24 09:51:02 +01:00
return ;
2018-12-21 18:49:02 +01:00
//Find the position of toots between those already present
int position = 0 ;
2019-05-25 18:58:31 +02:00
2019-09-06 17:55:14 +02:00
if ( position < this . statuses . size ( ) & & statuses . get ( 0 ) . getCreated_at ( ) ! = null & & this . statuses . get ( position ) . getCreated_at ( ) ! = null ) {
2019-05-13 19:38:48 +02:00
while ( position < this . statuses . size ( ) & & statuses . get ( 0 ) . getCreated_at ( ) . before ( this . statuses . get ( position ) . getCreated_at ( ) ) ) {
position + + ;
}
2018-12-21 18:49:02 +01:00
}
ArrayList < Status > tmpStatuses = new ArrayList < > ( ) ;
for ( Status tmpStatus : statuses ) {
//Put the toot at its place in the list (id desc)
2019-09-06 17:55:14 +02:00
if ( ! apiResponse . isFetchmore ( ) & & this . statuses . size ( ) > 0 & & ! this . statuses . contains ( tmpStatus ) & & tmpStatus . getCreated_at ( ) ! = null & & this . statuses . get ( 0 ) . getCreated_at ( ) ! = null & & tmpStatus . getCreated_at ( ) . after ( this . statuses . get ( 0 ) . getCreated_at ( ) ) ) { //Element not already added
2019-05-25 19:12:04 +02:00
//Mark status at new ones when their id is greater than the last read toot id
2019-09-29 18:18:20 +02:00
if ( ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) & & lastReadTootDate ! = null & & tmpStatus . getCreated_at ( ) . after ( lastReadTootDate ) ) {
2019-05-25 19:12:04 +02:00
tmpStatus . setNew ( true ) ;
MainActivity . countNewStatus + + ;
}
2019-05-25 18:58:31 +02:00
tmpStatuses . add ( tmpStatus ) ;
2019-09-06 17:55:14 +02:00
} else if ( apiResponse . isFetchmore ( ) & & ! this . statuses . contains ( tmpStatus ) ) { //Element not already added
2018-12-21 18:49:02 +01:00
//Mark status at new ones when their id is greater than the last read toot id
2019-09-29 18:18:20 +02:00
if ( ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) & & lastReadTootDate ! = null & & tmpStatus . getCreated_at ( ) . after ( lastReadTootDate ) ) {
2018-12-21 18:49:02 +01:00
tmpStatus . setNew ( true ) ;
MainActivity . countNewStatus + + ;
}
tmpStatuses . add ( tmpStatus ) ;
}
}
2018-12-21 19:15:35 +01:00
try {
( ( MainActivity ) context ) . updateHomeCounter ( ) ;
2019-09-06 17:55:14 +02:00
} catch ( Exception ignored ) {
}
2019-08-31 16:41:29 +02:00
int tootPerPage = sharedpreferences . getInt ( Helper . SET_TOOT_PER_PAGE , Helper . TOOTS_PER_PAGE ) ;
2018-12-21 18:49:02 +01:00
//Display the fetch more toot button
2019-09-06 17:55:14 +02:00
if ( tmpStatuses . size ( ) > = tootPerPage ) {
if ( initialBookMarkDate ! = null & & tmpStatuses . size ( ) > 0 & & tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . getCreated_at ( ) . after ( initialBookMarkDate ) ) {
if ( StatusListAdapter . fetch_all_more & & statuses . size ( ) > 0 ) {
2019-05-05 16:53:35 +02:00
fetchMore ( tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . getId ( ) ) ;
2019-09-06 17:55:14 +02:00
} else {
2019-05-05 16:53:35 +02:00
tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . setFetchMore ( true ) ;
StatusListAdapter . fetch_all_more = false ;
}
2018-12-21 18:49:02 +01:00
}
2019-09-06 17:55:14 +02:00
} else {
2019-05-05 16:53:35 +02:00
StatusListAdapter . fetch_all_more = false ;
2018-12-21 18:49:02 +01:00
}
this . statuses . addAll ( position , tmpStatuses ) ;
2019-09-29 18:18:20 +02:00
if ( statusListAdapter ! = null )
statusListAdapter . notifyItemRangeInserted ( position , tmpStatuses . size ( ) ) ;
if ( pixelfedListAdapter ! = null )
pixelfedListAdapter . notifyItemRangeInserted ( position , tmpStatuses . size ( ) ) ;
2019-01-22 16:31:54 +01:00
boolean display_content_after_fetch_more = sharedpreferences . getBoolean ( Helper . SET_DISPLAY_CONTENT_AFTER_FM , true ) ;
2019-09-06 17:55:14 +02:00
if ( position > 0 & & display_content_after_fetch_more )
2019-01-22 16:31:54 +01:00
lv_status . scrollToPosition ( position + tmpStatuses . size ( ) ) ;
2019-09-06 17:55:14 +02:00
if ( textviewNoAction . getVisibility ( ) = = View . VISIBLE & & tmpStatuses . size ( ) > 0 ) {
2018-12-26 16:18:13 +01:00
textviewNoAction . setVisibility ( View . GONE ) ;
lv_status . setVisibility ( View . VISIBLE ) ;
}
2017-12-06 16:56:59 +01:00
}
2018-12-23 11:36:11 +01:00
//Update last read toots value when pressing tab button
2019-09-06 17:55:14 +02:00
public void updateLastReadToot ( ) {
2019-09-29 18:18:20 +02:00
if ( ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) & & this . statuses ! = null & & this . statuses . size ( ) > 0 ) {
2018-12-23 11:36:11 +01:00
lastReadToot = this . statuses . get ( 0 ) . getId ( ) ;
}
}
2019-01-10 11:51:25 +01:00
2019-04-22 13:16:35 +02:00
private void manageAsyncTask ( boolean pagination ) {
2019-01-14 18:16:45 +01:00
//Message for an account
if ( type = = RetrieveFeedsAsyncTask . Type . USER | | type = = RetrieveFeedsAsyncTask . Type . CHANNEL )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , targetedId , max_id , showMediaOnly , showPinned , showReply , DisplayStatusFragment . this ) . execute ( ) ;
2019-04-22 13:16:35 +02:00
//Tag timelines
2019-04-26 15:50:26 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . SEARCH )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , tag , targetedId , max_id , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . TAG )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , timelineId , max_id , DisplayStatusFragment . this ) . execute ( ) ;
2019-04-22 13:16:35 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE ) {
2019-01-14 18:16:45 +01:00
//Remote instances
2019-04-22 13:16:35 +02:00
if ( search_peertube = = null ) { //Not a Peertube search
if ( remote_channel_name = = null ) { //Not a channel
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , remoteInstance , max_id , DisplayStatusFragment . this ) . execute ( ) ;
2019-04-22 13:16:35 +02:00
} else
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , remoteInstance , remote_channel_name , null , DisplayStatusFragment . this ) . execute ( ) ;
2019-04-22 13:16:35 +02:00
} else
2019-09-15 17:43:42 +02:00
asyncTask = new RetrievePeertubeSearchAsyncTask ( context , remoteInstance , search_peertube , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE_FILTERED ) {
2019-05-25 12:37:50 +02:00
RetrieveFeedsParam retrieveFeedsParam = new RetrieveFeedsParam ( ) ;
retrieveFeedsParam . setAction ( type ) ;
retrieveFeedsParam . setCurrentfilter ( currentfilter ) ;
retrieveFeedsParam . setRemoteInstance ( remoteInstance ) ;
retrieveFeedsParam . setMax_id ( max_id ) ;
retrieveFeedsParam . setSocial ( instanceType ) ;
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , retrieveFeedsParam , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LIST ) {
2019-09-15 17:43:42 +02:00
new ManageListsAsyncTask ( context , targetedId , max_id , null , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
} else {
if ( ! pagination ) {
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2019-01-14 18:16:45 +01:00
if ( context instanceof BaseMainActivity ) {
2019-05-25 18:58:31 +02:00
boolean remember_position_home = sharedpreferences . getBoolean ( Helper . SET_REMEMBER_POSITION_HOME , true ) ;
2019-09-06 17:55:14 +02:00
if ( remember_position_home )
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , initialBookMark , DisplayStatusFragment . this ) . execute ( ) ;
2019-05-25 18:58:31 +02:00
else
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , null , DisplayStatusFragment . this ) . execute ( ) ;
2019-01-14 18:16:45 +01:00
}
} else { //Most classical search will be done by this call
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , null , DisplayStatusFragment . this ) . execute ( ) ;
2019-01-14 18:16:45 +01:00
}
2019-09-06 17:55:14 +02:00
} else {
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME ) {
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , max_id , DisplayStatusFragment . this ) . execute ( ) ;
2019-09-06 17:55:14 +02:00
} else { //Most classical search will be done by this call for pagination
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , max_id , DisplayStatusFragment . this ) . execute ( ) ;
2019-01-14 18:16:45 +01:00
}
}
}
}
2019-04-22 13:16:35 +02:00
@Override
public void onActionDone ( ManageListsAsyncTask . action actionType , APIResponse apiResponse , int statusCode ) {
mainLoader . setVisibility ( View . GONE ) ;
nextElementLoader . setVisibility ( View . GONE ) ;
//Discards 404 - error which can often happen due to toots which have been deleted
2019-11-06 10:43:07 +01:00
if ( context = = null ) {
return ;
}
2019-04-22 13:16:35 +02:00
if ( apiResponse . getError ( ) ! = null ) {
2019-09-06 17:55:14 +02:00
if ( ! apiResponse . getError ( ) . getError ( ) . startsWith ( " 404 - " ) )
2019-09-30 18:14:46 +02:00
if ( apiResponse . getError ( ) . getError ( ) . length ( ) < 100 ) {
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , Toast . LENGTH_LONG ) . show ( ) ;
} else {
Toasty . error ( context , getString ( R . string . long_api_error , " \ ud83d \ ude05 " ) , Toast . LENGTH_LONG ) . show ( ) ;
}
2019-04-22 13:16:35 +02:00
swipeRefreshLayout . setRefreshing ( false ) ;
isSwipped = false ;
flag_loading = false ;
return ;
}
2019-09-06 17:55:14 +02:00
if ( actionType = = ManageListsAsyncTask . action . GET_LIST_TIMELINE ) {
2019-04-22 13:16:35 +02:00
int previousPosition = this . statuses . size ( ) ;
List < Status > statuses = apiResponse . getStatuses ( ) ;
max_id = apiResponse . getMax_id ( ) ;
flag_loading = ( max_id = = null ) ;
if ( ! isSwipped & & firstLoad & & ( statuses = = null | | statuses . size ( ) = = 0 ) )
textviewNoAction . setVisibility ( View . VISIBLE ) ;
else
textviewNoAction . setVisibility ( View . GONE ) ;
if ( isSwipped ) {
if ( previousPosition > 0 ) {
for ( int i = 0 ; i < previousPosition ; i + + ) {
this . statuses . remove ( 0 ) ;
}
statusListAdapter . notifyItemRangeRemoved ( 0 , previousPosition ) ;
}
isSwipped = false ;
}
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
this . statuses . addAll ( statuses ) ;
statusListAdapter . notifyItemRangeInserted ( previousPosition , statuses . size ( ) ) ;
}
swipeRefreshLayout . setRefreshing ( false ) ;
firstLoad = false ;
}
}
2019-08-14 18:55:45 +02:00
public void pullToRefresh ( ) {
2019-09-06 17:55:14 +02:00
if ( swipeRefreshLayout ! = null ) {
2019-08-14 18:55:45 +02:00
swipeRefreshLayout . setRefreshing ( true ) ;
2019-09-06 17:55:14 +02:00
} else {
2019-08-14 18:55:45 +02:00
return ;
}
2019-09-06 17:55:14 +02:00
if ( instanceType = = null | | ! instanceType . equals ( " PEERTUBE " ) ) {
2019-09-29 18:18:20 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . PF_HOME )
2019-08-14 18:55:45 +02:00
MainActivity . countNewStatus = 0 ;
isSwipped = true ;
2019-08-15 17:50:11 +02:00
int lenght = statuses . size ( ) ;
statuses . clear ( ) ;
switch ( instanceType ) {
case " MASTODON " :
case " MISSKEY " :
case " GNU " :
statusListAdapter . notifyItemRangeRemoved ( 0 , lenght ) ;
break ;
case " PIXELFED " :
pixelfedListAdapter . notifyItemRangeRemoved ( 0 , lenght ) ;
break ;
case " ART " :
artListAdapter . notifyItemRangeRemoved ( 0 , lenght ) ;
break ;
2019-08-14 18:55:45 +02:00
}
2019-08-15 17:50:11 +02:00
max_id = null ;
manageAsyncTask ( false ) ;
2019-09-06 17:55:14 +02:00
} else if ( peertubes ! = null ) {
2019-08-14 18:55:45 +02:00
if ( peertubes . size ( ) > 0 ) {
int size = peertubes . size ( ) ;
isSwipped = true ;
peertubes . clear ( ) ;
peertubes = new ArrayList < > ( ) ;
max_id = " 0 " ;
peertubeAdapater . notifyItemRangeRemoved ( 0 , size ) ;
if ( search_peertube = = null ) { //Not a Peertube search
2019-09-15 17:43:42 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , remoteInstance , " 0 " , DisplayStatusFragment . this ) . execute ( ) ;
2019-08-14 18:55:45 +02:00
} else {
2019-09-15 17:43:42 +02:00
asyncTask = new RetrievePeertubeSearchAsyncTask ( context , remoteInstance , search_peertube , DisplayStatusFragment . this ) . execute ( ) ;
2019-08-14 18:55:45 +02:00
}
}
}
}
2017-05-05 16:36:04 +02:00
}