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-06-11 19:38:26 +02:00
import androidx.annotation.NonNull ;
import androidx.fragment.app.Fragment ;
import androidx.core.content.ContextCompat ;
import androidx.localbroadcastmanager.content.LocalBroadcastManager ;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout ;
import androidx.recyclerview.widget.LinearLayoutManager ;
import androidx.recyclerview.widget.RecyclerView ;
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.AccountDAO ;
import app.fedilab.android.sqlite.InstancesDAO ;
import app.fedilab.android.sqlite.SearchDAO ;
import app.fedilab.android.sqlite.Sqlite ;
import app.fedilab.android.sqlite.TempMuteDAO ;
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 ;
2017-12-09 07:34:36 +01:00
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-01-11 16:39:01 +01: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 ;
2017-08-24 15:57:35 +02:00
public DisplayStatusFragment ( ) {
}
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 ) ;
2017-08-03 14:38:47 +02:00
showMediaOnly = bundle . getBoolean ( " showMediaOnly " , false ) ;
2017-09-15 19:51:41 +02:00
showPinned = bundle . getBoolean ( " showPinned " , false ) ;
2018-09-05 10:19:07 +02:00
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-01-14 18:16:45 +01:00
instanceType = bundle . getString ( " instanceType " , " MASTODON " ) ;
2019-01-03 18:59:44 +01:00
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 ) ;
2019-04-22 13:16:35 +02:00
2017-05-05 16:36:04 +02:00
}
2019-01-03 18:59:44 +01:00
if ( ischannel )
type = RetrieveFeedsAsyncTask . Type . CHANNEL ;
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
if ( remoteInstance ! = null & & ! remoteInstance . equals ( " " ) & & instanceType = = null ) {
2018-10-06 15:59:00 +02:00
List < RemoteInstance > remoteInstanceObj = new InstancesDAO ( context , db ) . getInstanceByName ( remoteInstance ) ;
if ( remoteInstanceObj ! = null & & remoteInstanceObj . size ( ) > 0 )
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 ) ;
lv_status = rootView . findViewById ( R . id . lv_status ) ;
2017-10-24 10:30:49 +02:00
mainLoader = rootView . findViewById ( R . id . loader ) ;
2017-10-21 17:15:52 +02:00
nextElementLoader = rootView . findViewById ( R . id . loading_next_status ) ;
2017-10-24 10:30:49 +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 ) ;
2018-12-19 15:12:46 +01:00
instance = sharedpreferences . getString ( Helper . PREF_INSTANCE , context ! = null ? Helper . getLiveInstance ( context ) : null ) ;
2019-06-05 14:35:42 +02:00
Account account = new AccountDAO ( context , db ) . getUniqAccount ( userId , instance ) ;
2018-09-26 13:45:13 +02:00
mutedAccount = new TempMuteDAO ( context , db ) . getAllTimeMuted ( account ) ;
2018-12-19 15:12:46 +01:00
//For Home timeline, fetch stored values for bookmark and last read toot
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
initialBookMark = sharedpreferences . getString ( Helper . BOOKMARK_ID + userId + instance , null ) ;
2019-01-22 08:51:36 +01: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-01-22 08:51:36 +01:00
lastReadTootDate = Helper . stringToDate ( context , sharedpreferences . getString ( Helper . LAST_READ_TOOT_DATE + userId + instance , null ) ) ;
2018-12-19 15:12:46 +01:00
}
2019-05-11 19:58:41 +02:00
if ( instanceType = = null | | instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) {
2019-01-14 18:16:45 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . TAG & & tag ! = null ) {
BaseMainActivity . displayPeertube = null ;
List < TagTimeline > tagTimelines = new SearchDAO ( context , db ) . getTimelineInfo ( tag ) ;
if ( tagTimelines ! = null & & tagTimelines . size ( ) > 0 ) {
tagTimeline = tagTimelines . get ( 0 ) ;
statusListAdapter = new StatusListAdapter ( context , tagTimeline , targetedId , isOnWifi , this . statuses ) ;
lv_status . setAdapter ( statusListAdapter ) ;
}
} else {
BaseMainActivity . displayPeertube = null ;
statusListAdapter = new StatusListAdapter ( context , type , targetedId , isOnWifi , this . statuses ) ;
2018-12-15 17:13:06 +01:00
lv_status . setAdapter ( statusListAdapter ) ;
}
2019-01-14 18:16:45 +01:00
} else if ( instanceType . equals ( " PEERTUBE " ) ) {
2019-01-06 18:18:13 +01:00
if ( remoteInstance ! = null & & MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PEERTUBE ) //if it's a Peertube account connected
2019-01-03 14:23:13 +01:00
remoteInstance = account . getInstance ( ) ;
2018-10-20 14:39:24 +02:00
BaseMainActivity . displayPeertube = remoteInstance ;
2019-01-07 19:16:15 +01:00
peertubeAdapater = new PeertubeAdapter ( context , remoteInstance , ownVideos , this . peertubes ) ;
2018-10-06 15:59:00 +02:00
lv_status . setAdapter ( peertubeAdapater ) ;
2019-01-14 18:16:45 +01:00
} else if ( instanceType . equals ( " PIXELFED " ) ) {
2019-01-15 11:00:54 +01:00
if ( remoteInstance ! = null & & MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PIXELFED ) //if it's a Peertube account connected
remoteInstance = account . getInstance ( ) ;
2019-01-15 14:43:56 +01:00
pixelfedListAdapter = new PixelfedListAdapter ( context , type , this . statuses ) ;
2019-01-14 18:16:45 +01:00
lv_status . setAdapter ( pixelfedListAdapter ) ;
} else if ( instanceType . equals ( " ART " ) ) {
2019-01-24 09:57:55 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . TAG ) {
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-01-14 18:16:45 +01:00
artListAdapter = new ArtListAdapter ( context , this . statuses ) ;
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-02-08 15:07:46 +01:00
if ( MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . MASTODON | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . PLEROMA | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . GNU | | MainActivity . social = = UpdateAccountInfoAsyncTask . SOCIAL . FRIENDICA ) {
2019-01-10 11:51:25 +01:00
if ( receive_action ! = null )
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-01-13 11:34:32 +01:00
if ( status ! = null & & statusListAdapter ! = null ) {
2019-03-30 18:48:38 +01:00
statusListAdapter . notifyStatusWithActionChanged ( status ) ;
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
if ( type = = RetrieveFeedsAsyncTask . Type . HOME | | type = = RetrieveFeedsAsyncTask . Type . LOCAL | | type = = RetrieveFeedsAsyncTask . Type . PUBLIC ) {
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 ) ;
}
}
} ;
}
if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC )
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_data , new IntentFilter ( Helper . RECEIVE_FEDERATED_DATA ) ) ;
else if ( type = = RetrieveFeedsAsyncTask . Type . HOME )
LocalBroadcastManager . getInstance ( context ) . registerReceiver ( receive_data , new IntentFilter ( Helper . RECEIVE_HOME_DATA ) ) ;
else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL )
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
2018-10-20 14:39:24 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE & & search_peertube ! = null )
( ( Activity ) context ) . setTitle ( remoteInstance + " - " + search_peertube ) ;
2018-10-22 19:19:39 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE & & remote_channel_name ! = null )
( ( Activity ) context ) . setTitle ( remote_channel_name + " - " + remoteInstance ) ;
2019-01-14 18:16:45 +01:00
if ( type ! = RetrieveFeedsAsyncTask . Type . POVERVIEW ) //No paginations for Peertube Overviews (it's a fixed size content
lv_status . addOnScrollListener ( new RecyclerView . OnScrollListener ( ) {
public void onScrolled ( @NonNull RecyclerView recyclerView , int dx , int dy )
{
if ( type ! = RetrieveFeedsAsyncTask . Type . ART & & context instanceof BaseMainActivity ) {
if ( dy < 0 & & ! ( ( BaseMainActivity ) context ) . getFloatingVisibility ( ) )
( ( BaseMainActivity ) context ) . manageFloatingButton ( true ) ;
if ( dy > 0 & & ( ( BaseMainActivity ) context ) . getFloatingVisibility ( ) )
( ( BaseMainActivity ) context ) . manageFloatingButton ( false ) ;
}
int firstVisibleItem = mLayoutManager . findFirstVisibleItemPosition ( ) ;
if ( dy > 0 ) {
int visibleItemCount = mLayoutManager . getChildCount ( ) ;
int totalItemCount = mLayoutManager . getItemCount ( ) ;
if ( firstVisibleItem + visibleItemCount = = totalItemCount & & context ! = null ) {
if ( ! flag_loading ) {
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
}
if ( type = = RetrieveFeedsAsyncTask . Type . 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-05-13 17:51:43 +02:00
if ( lastReadTootDate = = null | | ( bookmarkL ! = null & & bookmarkL . after ( lastReadTootDate ) ) ) {
2019-01-30 17:04:20 +01:00
//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-04-21 18:50:56 +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 ( ) {
2018-11-23 19:34:44 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME )
MainActivity . countNewStatus = 0 ;
isSwipped = true ;
if ( type ! = RetrieveFeedsAsyncTask . Type . CONVERSATION )
2018-11-22 17:53:09 +01:00
retrieveMissingToots ( null ) ;
2019-01-26 12:26:55 +01:00
else {
if ( statuses . size ( ) > 0 )
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
} ) ;
else
swipeRefreshLayout . setOnRefreshListener ( new SwipeRefreshLayout . OnRefreshListener ( ) {
@Override
public void onRefresh ( ) {
if ( peertubes . size ( ) > 0 ) {
int size = peertubes . size ( ) ;
isSwipped = true ;
peertubes . clear ( ) ;
peertubes = new ArrayList < > ( ) ;
max_id = " 0 " ;
peertubeAdapater . notifyItemRangeRemoved ( 0 , size ) ;
asyncTask = new RetrieveFeedsAsyncTask ( context , type , remoteInstance , " 0 " , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
}
}
} ) ;
2018-05-11 16:33:16 +02:00
SharedPreferences sharedpreferences = context . getSharedPreferences ( Helper . APP_PREFS , Context . MODE_PRIVATE ) ;
int theme = sharedpreferences . getInt ( Helper . SET_THEME , Helper . THEME_DARK ) ;
switch ( theme ) {
case Helper . THEME_LIGHT :
swipeRefreshLayout . setColorSchemeResources ( R . color . mastodonC4 ,
R . color . mastodonC2 ,
R . color . mastodonC3 ) ;
swipeRefreshLayout . setProgressBackgroundColorSchemeColor ( ContextCompat . getColor ( context , R . color . white ) ) ;
break ;
case Helper . THEME_DARK :
swipeRefreshLayout . setColorSchemeResources ( R . color . mastodonC4__ ,
R . color . mastodonC4 ,
R . color . mastodonC4 ) ;
swipeRefreshLayout . setProgressBackgroundColorSchemeColor ( ContextCompat . getColor ( context , R . color . mastodonC1_ ) ) ;
break ;
case Helper . THEME_BLACK :
swipeRefreshLayout . setColorSchemeResources ( R . color . dark_icon ,
R . color . mastodonC2 ,
R . color . mastodonC3 ) ;
2018-05-12 12:06:43 +02:00
swipeRefreshLayout . setProgressBackgroundColorSchemeColor ( ContextCompat . getColor ( context , R . color . black_3 ) ) ;
2018-05-11 16:33:16 +02:00
break ;
}
2017-11-15 09:44:12 +01:00
if ( context ! = null ) {
2019-01-14 18:16:45 +01:00
//Load data depending of the value
manageAsyncTask ( false ) ;
2017-05-26 17:20:36 +02:00
} else {
2017-11-15 09:44:12 +01:00
new Handler ( Looper . getMainLooper ( ) ) . postDelayed ( new Runnable ( ) {
@Override
public void run ( ) {
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
public void onPause ( ) {
super . onPause ( ) ;
//Store bookmark on pause
if ( context instanceof BaseMainActivity & & type = = RetrieveFeedsAsyncTask . Type . HOME ) {
SharedPreferences . Editor editor = sharedpreferences . edit ( ) ;
if ( updatedBookMark ! = null )
editor . putString ( Helper . BOOKMARK_ID + userId + instance , updatedBookMark ) ;
2019-01-22 08:51:36 +01:00
if ( updatedBookMarkDate ! = null )
editor . putString ( Helper . BOOKMARK_DATE + userId + instance , Helper . dateToString ( updatedBookMarkDate ) ) ;
2018-12-19 15:12:46 +01:00
if ( lastReadToot ! = null )
editor . putString ( Helper . LAST_READ_TOOT_ID + userId + instance , lastReadToot ) ;
2019-01-30 17:04:20 +01:00
if ( lastReadTootDate ! = null )
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
public void onCreate ( Bundle saveInstance )
{
super . onCreate ( saveInstance ) ;
}
@Override
public void onAttach ( Context context ) {
super . onAttach ( context ) ;
this . context = context ;
}
2017-07-05 13:12:50 +02:00
@Override
public void onDestroy ( ) {
super . onDestroy ( ) ;
2017-05-05 16:36:04 +02:00
if ( asyncTask ! = null & & asyncTask . getStatus ( ) = = AsyncTask . Status . RUNNING )
asyncTask . cancel ( true ) ;
2019-01-10 11:51:25 +01:00
if ( receive_action ! = null )
LocalBroadcastManager . getInstance ( context ) . unregisterReceiver ( receive_action ) ;
2019-01-11 16:39:01 +01:00
if ( receive_data ! = null )
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-01-10 16:05:48 +01:00
if ( this . peertubes = = null | | this . statuses = = null | | apiResponse = = null | | ( apiResponse . getError ( ) ! = null & & apiResponse . getError ( ) . getStatusCode ( ) ! = 404 ) ) {
2018-10-10 08:33:36 +02:00
if ( apiResponse = = null )
2018-11-25 10:45:16 +01:00
Toasty . error ( context , context . getString ( R . string . toast_error ) , Toast . LENGTH_LONG ) . show ( ) ;
2018-10-10 08:33:36 +02:00
else
2018-11-25 10:45:16 +01:00
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , 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-01-14 18:16:45 +01:00
if ( instanceType . equals ( " PEERTUBE " ) ) {
2018-10-07 10:45:34 +02:00
int previousPosition = this . peertubes . size ( ) ;
if ( max_id = = null )
max_id = " 0 " ;
2018-12-19 15:12:46 +01:00
//max_id needs to work like an offset
2019-05-26 12:04:00 +02:00
int tootPerPage = sharedpreferences . getInt ( Helper . SET_TOOTS_PER_PAGE , 40 ) ;
max_id = String . valueOf ( Integer . valueOf ( max_id ) + tootPerPage ) ;
2019-01-10 16:05:48 +01:00
if ( apiResponse . getPeertubes ( ) = = null ) {
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
2018-10-07 14:48:51 +02:00
if ( previousPosition = = 0 ) {
2019-01-07 19:16:15 +01:00
peertubeAdapater = new PeertubeAdapter ( context , remoteInstance , ownVideos , this . peertubes ) ;
2018-10-07 14:48:51 +02:00
lv_status . setAdapter ( peertubeAdapater ) ;
} else
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-01-12 17:55:18 +01: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 ;
2017-12-09 12:40:53 +01:00
} else {
2019-01-14 19:27:15 +01:00
2018-12-19 15:12:46 +01:00
//When Mastodon statuses have been fetched.
if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) { //Conversation timeline
//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 < > ( ) ;
2018-11-22 07:47:43 +01:00
if ( conversations ! = null ) {
for ( Conversation conversation : conversations ) {
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-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 ;
if ( apiResponse . getResults ( ) ! = null & & apiResponse . getResults ( ) . getStatuses ( ) ! = null )
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-01-14 18:16:45 +01:00
if ( instanceType . equals ( " PIXELFED " ) ) {
2018-12-26 15:43:36 +01:00
if ( max_id = = null )
max_id = " 1 " ;
//max_id needs to work like an offset
max_id = String . valueOf ( Integer . valueOf ( max_id ) + 1 ) ;
2019-03-31 15:15:46 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . SEARCH ) {
if ( max_id = = null )
max_id = " 0 " ;
max_id = String . valueOf ( Integer . valueOf ( max_id ) + 20 ) ;
} 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
2018-10-07 11:57:15 +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.
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 ) ;
} else {
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
2018-12-21 18:49:02 +01:00
2018-10-07 11:57:15 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME & & ! firstTootsLoaded ) {
2019-05-25 18:58:31 +02:00
boolean remember_position_home = sharedpreferences . getBoolean ( Helper . SET_REMEMBER_POSITION_HOME , true ) ;
2019-05-25 19:12:04 +02:00
if ( remember_position_home )
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2018-10-07 11:57:15 +02:00
firstTootsLoaded = true ;
}
2018-12-19 15:12:46 +01:00
//Let's deal with statuses
2018-10-07 11:57:15 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
2019-05-11 19:58:41 +02:00
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-01-21 18:49:02 +01: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-01-14 19:27:15 +01:00
if ( ! show_nsfw ) {
2018-12-31 17:30:51 +01:00
ArrayList < Status > safeStatuses = new ArrayList < > ( ) ;
for ( Status status : statuses ) {
if ( ! status . isSensitive ( ) )
safeStatuses . add ( status ) ;
}
this . statuses . addAll ( safeStatuses ) ;
2019-01-14 19:27:15 +01:00
artListAdapter . notifyItemRangeInserted ( previousPosition , safeStatuses . size ( ) ) ;
} 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
} 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
* @param status Status
* /
2017-09-13 08:38:08 +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 ;
2017-11-15 19:02:33 +01:00
if ( status . getId ( ) ! = null & & statuses ! = null & & statuses . size ( ) > 0 & & statuses . get ( 0 ) ! = null
2019-01-22 08:51:36 +01:00
& & 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 ) ;
if ( tempTootResult . size ( ) > 0 )
2018-09-26 13:45:13 +02:00
status = tempTootResult . get ( 0 ) ;
2017-11-15 09:44:12 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
2017-12-28 15:33:02 +01:00
//Makes sure the status is not already displayed
2018-01-04 15:29:23 +01: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 ) ;
2018-12-19 15:12:46 +01:00
try {
( ( MainActivity ) context ) . updateHomeCounter ( ) ;
} catch ( Exception ignored ) { }
2019-01-14 18:32:59 +01:00
2019-01-14 19:27:15 +01:00
statusListAdapter . notifyItemInserted ( 0 ) ;
2017-12-28 15:33:02 +01:00
}
2017-11-15 09:44:12 +01:00
2019-02-27 09:54:38 +01: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
2017-09-29 16:10:11 +02:00
@Override
public void onResume ( ) {
super . onResume ( ) ;
2017-12-29 11:21:24 +01:00
boolean liveNotifications = sharedpreferences . getBoolean ( Helper . SET_LIVE_NOTIFICATIONS , true ) ;
2018-11-23 19:18:38 +01:00
int batteryProfile = sharedpreferences . getInt ( Helper . SET_BATTERY_PROFILE , Helper . BATTERY_PROFILE_NORMAL ) ;
2018-12-19 10:54:26 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
if ( getUserVisibleHint ( ) ) {
2018-12-19 16:31:48 +01:00
statusListAdapter . updateMuted ( mutedAccount ) ;
2019-05-11 12:51:13 +02:00
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
}
} else if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC ) {
2017-09-29 19:07:42 +02:00
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 ( ) ;
2018-11-23 19:18:38 +01:00
if ( liveNotifications & & batteryProfile = = Helper . BATTERY_PROFILE_NORMAL ) {
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 ) ;
} catch ( Exception ignored ) { }
2017-12-29 11:21:24 +01:00
}
2017-10-07 08:34:50 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-29 16:22:36 +02:00
}
2017-09-30 09:00:00 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL ) {
2017-09-30 10:57:14 +02:00
2017-09-30 09:00:00 +02:00
if ( getUserVisibleHint ( ) ) {
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 ( ) ;
2018-11-23 19:18:38 +01:00
if ( liveNotifications & & batteryProfile = = Helper . BATTERY_PROFILE_NORMAL ) {
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 ) ;
} catch ( Exception ignored ) { }
2017-12-29 11:21:24 +01:00
}
2017-10-07 08:34:50 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-30 09:00:00 +02:00
}
2019-02-27 09:54:38 +01:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . DIRECT | | type = = RetrieveFeedsAsyncTask . Type . GNU_DM ) {
2018-10-26 17:00:38 +02:00
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
}
2018-11-18 17:24:12 +01:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) {
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
}
2018-11-21 18:04:10 +01:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . TAG ) {
if ( getUserVisibleHint ( ) ) {
if ( statuses ! = null & & statuses . size ( ) > 0 )
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 )
* @param sinceId String
* /
public void retrieveMissingToots ( String sinceId ) {
2018-12-23 10:43:45 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME )
2019-05-25 19:12:04 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-01-14 19:27:15 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE )
2018-08-23 16:10:57 +02:00
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , remoteInstance , sinceId , type , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2018-12-16 18:03:39 +01:00
else if ( type = = RetrieveFeedsAsyncTask . Type . TAG )
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , tag , sinceId , type , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2018-08-24 15:47:16 +02:00
else
asyncTask = new RetrieveMissingFeedsAsyncTask ( context , sinceId , type , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2017-09-27 17:52:23 +02:00
}
2019-05-09 19:03:02 +02:00
public void retrieveMissingHome ( ) {
if ( statusListAdapter ! = null & & statuses ! = null & & lv_status ! = null & & mLayoutManager ! = null ) {
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-05-13 07:21:09 +02:00
if ( statuses . size ( ) > 0 )
initialBookMarkDate = statuses . get ( 0 ) . getCreated_at ( ) ;
2019-05-25 19:12:04 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , null , false , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
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
* @param visible boolean
* /
2017-09-13 15:21:03 +02:00
@Override
public void setMenuVisibility ( final boolean visible ) {
super . setMenuVisibility ( visible ) ;
if ( context = = null )
return ;
2017-12-29 11:21:24 +01:00
boolean liveNotifications = sharedpreferences . getBoolean ( Helper . SET_LIVE_NOTIFICATIONS , true ) ;
2018-11-23 19:18:38 +01:00
int batteryProfile = sharedpreferences . getInt ( Helper . SET_BATTERY_PROFILE , Helper . BATTERY_PROFILE_NORMAL ) ;
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
2018-12-19 10:54:26 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
if ( visible ) {
2019-02-06 17:53:49 +01: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
}
2017-10-07 08:34:50 +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 ( ) ;
2018-11-23 19:18:38 +01:00
if ( liveNotifications & & batteryProfile = = Helper . BATTERY_PROFILE_NORMAL ) {
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 ) ;
} catch ( Exception ignored ) { }
2017-12-29 11:21:24 +01:00
}
2017-10-07 08:34:50 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-29 07:19:30 +02:00
} else {
2017-11-11 10:05:37 +01:00
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
}
}
2017-09-30 09:00:00 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL ) {
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 ( ) ;
2018-11-23 19:18:38 +01:00
if ( liveNotifications & & batteryProfile = = Helper . BATTERY_PROFILE_NORMAL ) {
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 ) ;
} catch ( Exception ignored ) { }
2017-12-29 11:21:24 +01:00
}
2017-10-07 08:34:50 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 )
retrieveMissingToots ( statuses . get ( 0 ) . getId ( ) ) ;
2017-09-30 09:00:00 +02:00
} else {
2017-11-11 10:05:37 +01:00
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
}
2017-09-29 14:08:46 +02:00
@Override
public void onStop ( ) {
super . onStop ( ) ;
2019-05-12 09:21:42 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . PUBLIC & & 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-30 09:00:00 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LOCAL & & streamingLocalIntent ! = null ) {
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 14:08:46 +02:00
}
}
2017-08-17 15:48:36 +02:00
public void scrollToTop ( ) {
2019-01-21 18:49:02 +01:00
if ( lv_status ! = null & & instanceType ! = null ) {
2019-05-11 19:58:41 +02:00
if ( statusListAdapter ! = null & & ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) ) )
2019-01-21 18:49:02 +01:00
lv_status . setAdapter ( statusListAdapter ) ;
else if ( pixelfedListAdapter ! = null & & instanceType . equals ( " PIXELFED " ) )
lv_status . setAdapter ( pixelfedListAdapter ) ;
else if ( artListAdapter ! = null & & instanceType . equals ( " ART " ) )
lv_status . setAdapter ( artListAdapter ) ;
2019-01-30 17:39:10 +01:00
else if ( peertubeAdapater ! = null & & instanceType . equals ( " PEERTUBE " ) )
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
* /
public void refreshFilter ( ) {
2019-01-14 19:27:15 +01:00
2019-05-11 19:58:41 +02:00
if ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) )
2019-01-14 19:27:15 +01:00
statusListAdapter . notifyDataSetChanged ( ) ;
else if ( instanceType . equals ( " PIXELFED " ) )
pixelfedListAdapter . notifyDataSetChanged ( ) ;
else if ( instanceType . equals ( " ART " ) )
artListAdapter . notifyDataSetChanged ( ) ;
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 ) {
2018-11-04 10:01:16 +01:00
if ( swipeRefreshLayout = = null )
return ;
2019-05-22 17:33:52 +02:00
//Clean label new
2018-03-10 12:18:31 +01:00
swipeRefreshLayout . setRefreshing ( false ) ;
2018-04-25 14:03:15 +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
2017-09-27 17:52:23 +02:00
if ( statuses ! = null & & statuses . size ( ) > 0 ) {
2019-01-26 12:26:55 +01:00
if ( textviewNoAction . getVisibility ( ) = = View . VISIBLE ) {
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 ;
2018-11-21 18:04:10 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . CONVERSATION ) { //Remove conversation already displayed if new messages
int position = 0 ;
2018-11-23 19:34:44 +01:00
insertedConversation = statuses . size ( ) ;
2018-11-21 18:04:10 +01:00
if ( this . statuses ! = null ) {
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-05-11 19:58:41 +02:00
if ( instanceType . equals ( " MASTODON " ) | | instanceType . equals ( " MISSKEY " ) | | instanceType . equals ( " GNU " ) )
2019-01-14 19:27:15 +01:00
statusListAdapter . notifyItemRemoved ( position ) ;
else if ( instanceType . equals ( " PIXELFED " ) )
pixelfedListAdapter . notifyItemRemoved ( position ) ;
else if ( instanceType . equals ( " ART " ) )
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 - - ) {
2018-09-26 13:45:13 +02:00
if ( this . statuses ! = null ) {
2018-12-27 17:49:50 +01:00
if ( type ! = RetrieveFeedsAsyncTask . Type . HOME ) {
2019-01-24 09:54:26 +01:00
if ( tagTimeline ! = null & & instanceType . equals ( " ART " ) & & ! tagTimeline . isNSFW ( ) ) {
if ( ! statuses . get ( i ) . isSensitive ( ) ) {
this . statuses . add ( 0 , statuses . get ( i ) ) ;
inserted + + ;
}
} 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
}
} else {
2019-01-22 14:31:09 +01:00
if ( lastReadTootDate ! = null & & statuses . get ( i ) . getCreated_at ( ) . after ( lastReadTootDate ) ) {
2018-12-28 15:21:36 +01:00
if ( ! this . statuses . contains ( statuses . get ( i ) ) ) {
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-05-11 19:58:41 +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-01-24 09:54:26 +01:00
else if ( pixelfedListAdapter ! = null & & instanceType . equals ( " PIXELFED " ) )
2019-01-14 19:27:15 +01:00
pixelfedListAdapter . notifyItemRangeInserted ( 0 , inserted ) ;
2019-01-24 09:54:26 +01: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 {
2017-10-25 13:45:22 +02:00
if ( type = = RetrieveFeedsAsyncTask . Type . HOME )
( ( MainActivity ) context ) . updateHomeCounter ( ) ;
2018-11-22 19:15:31 +01:00
else {
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
}
2017-09-27 17:52:23 +02:00
} catch ( Exception ignored ) { }
}
}
2017-12-06 16:56:59 +01:00
public void fetchMore ( String max_id ) {
2019-05-25 19:12:04 +02:00
asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask ( context , max_id , true , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2018-12-21 18:49:02 +01:00
}
@Override
public void onRetrieveFeedsAfterBookmark ( APIResponse apiResponse ) {
2019-05-25 18:58:31 +02:00
2019-02-06 17:53:49 +01:00
if ( statusListAdapter = = null )
return ;
2018-12-21 18:49:02 +01: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 ( ) ;
else
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , Toast . LENGTH_LONG ) . show ( ) ;
swipeRefreshLayout . setRefreshing ( false ) ;
flag_loading = false ;
return ;
}
List < Status > statuses = apiResponse . getStatuses ( ) ;
2019-05-25 18:58:31 +02:00
2019-05-13 17:51:43 +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-05-14 18:26:49 +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-06-03 07:42:46 +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
if ( type = = RetrieveFeedsAsyncTask . Type . HOME & & lastReadTootDate ! = null & & tmpStatus . getCreated_at ( ) . after ( lastReadTootDate ) ) {
tmpStatus . setNew ( true ) ;
MainActivity . countNewStatus + + ;
}
2019-05-25 18:58:31 +02:00
tmpStatuses . add ( tmpStatus ) ;
2019-05-25 19:12:04 +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-01-22 14:31:09 +01:00
if ( type = = RetrieveFeedsAsyncTask . Type . 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 ( ) ;
} catch ( Exception ignored ) { }
2018-12-21 18:49:02 +01:00
int tootPerPage = sharedpreferences . getInt ( Helper . SET_TOOTS_PER_PAGE , 40 ) ;
//Display the fetch more toot button
if ( tmpStatuses . size ( ) > = tootPerPage ) {
2019-05-11 12:51:13 +02:00
if ( initialBookMarkDate ! = null & & tmpStatuses . size ( ) > 0 & & tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . getCreated_at ( ) . after ( initialBookMarkDate ) ) {
2019-05-05 16:53:35 +02:00
if ( StatusListAdapter . fetch_all_more & & statuses . size ( ) > 0 ) {
fetchMore ( tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . getId ( ) ) ;
} else {
tmpStatuses . get ( tmpStatuses . size ( ) - 1 ) . setFetchMore ( true ) ;
StatusListAdapter . fetch_all_more = false ;
}
2018-12-21 18:49:02 +01:00
}
2019-05-05 16:53:35 +02:00
} else {
StatusListAdapter . fetch_all_more = false ;
2018-12-21 18:49:02 +01:00
}
this . statuses . addAll ( position , tmpStatuses ) ;
2019-01-22 16:31:54 +01:00
boolean display_content_after_fetch_more = sharedpreferences . getBoolean ( Helper . SET_DISPLAY_CONTENT_AFTER_FM , true ) ;
if ( position > 0 & & display_content_after_fetch_more )
lv_status . scrollToPosition ( position + tmpStatuses . size ( ) ) ;
2018-12-21 18:49:02 +01:00
statusListAdapter . notifyItemRangeInserted ( position , tmpStatuses . size ( ) ) ;
2018-12-26 16:18:13 +01:00
if ( textviewNoAction . getVisibility ( ) = = View . VISIBLE & & tmpStatuses . size ( ) > 0 ) {
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
public void updateLastReadToot ( ) {
if ( type = = RetrieveFeedsAsyncTask . Type . HOME & & this . statuses ! = null & & this . statuses . size ( ) > 0 ) {
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-04-22 13:16:35 +02:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , targetedId , max_id , showMediaOnly , showPinned , showReply , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
//Tag timelines
2019-04-26 15:50:26 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . SEARCH )
2019-01-14 18:16:45 +01:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , tag , targetedId , max_id , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-04-26 15:50:26 +02:00
else if ( type = = RetrieveFeedsAsyncTask . Type . TAG )
asyncTask = new RetrieveFeedsAsyncTask ( context , type , timelineId , max_id , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
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-01-14 18:16:45 +01:00
asyncTask = new RetrieveFeedsAsyncTask ( context , type , remoteInstance , max_id , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-04-22 13:16:35 +02:00
} else
2019-01-14 18:16:45 +01:00
asyncTask = new RetrieveFeedsAsyncTask ( context , remoteInstance , remote_channel_name , null , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-04-22 13:16:35 +02:00
} else
2019-01-14 18:16:45 +01:00
asyncTask = new RetrievePeertubeSearchAsyncTask ( context , remoteInstance , search_peertube , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-05-25 12:37:50 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . REMOTE_INSTANCE_FILTERED ) {
RetrieveFeedsParam retrieveFeedsParam = new RetrieveFeedsParam ( ) ;
retrieveFeedsParam . setAction ( type ) ;
retrieveFeedsParam . setCurrentfilter ( currentfilter ) ;
retrieveFeedsParam . setRemoteInstance ( remoteInstance ) ;
retrieveFeedsParam . setMax_id ( max_id ) ;
retrieveFeedsParam . setSocial ( instanceType ) ;
asyncTask = new RetrieveFeedsAsyncTask ( context , retrieveFeedsParam , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-04-22 13:16:35 +02:00
} else if ( type = = RetrieveFeedsAsyncTask . Type . LIST ) {
new ManageListsAsyncTask ( context , targetedId , max_id , null , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-01-14 18:16:45 +01:00
} else {
if ( ! pagination ) {
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
if ( context instanceof BaseMainActivity ) {
2019-05-25 18:58:31 +02:00
boolean remember_position_home = sharedpreferences . getBoolean ( Helper . SET_REMEMBER_POSITION_HOME , true ) ;
if ( remember_position_home )
asyncTask = new RetrieveFeedsAsyncTask ( context , type , initialBookMark , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
else
asyncTask = new RetrieveFeedsAsyncTask ( context , type , null , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
2019-01-14 18:16:45 +01:00
}
} else { //Most classical search will be done by this call
asyncTask = new RetrieveFeedsAsyncTask ( context , type , null , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
}
} else {
if ( type = = RetrieveFeedsAsyncTask . Type . HOME ) {
asyncTask = new RetrieveFeedsAsyncTask ( context , type , max_id , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
} else { //Most classical search will be done by this call for pagination
asyncTask = new RetrieveFeedsAsyncTask ( context , type , max_id , DisplayStatusFragment . this ) . executeOnExecutor ( AsyncTask . THREAD_POOL_EXECUTOR ) ;
}
}
}
}
2019-04-22 13:16:35 +02:00
@Override
public void onActionDone ( ManageListsAsyncTask . action actionType , APIResponse apiResponse , int statusCode ) {
final SharedPreferences sharedpreferences = context . getSharedPreferences ( Helper . APP_PREFS , Context . MODE_PRIVATE ) ;
mainLoader . setVisibility ( View . GONE ) ;
nextElementLoader . setVisibility ( View . GONE ) ;
//Discards 404 - error which can often happen due to toots which have been deleted
if ( apiResponse . getError ( ) ! = null ) {
if ( ! apiResponse . getError ( ) . getError ( ) . startsWith ( " 404 - " ) )
Toasty . error ( context , apiResponse . getError ( ) . getError ( ) , Toast . LENGTH_LONG ) . show ( ) ;
swipeRefreshLayout . setRefreshing ( false ) ;
isSwipped = false ;
flag_loading = false ;
return ;
}
if ( actionType = = ManageListsAsyncTask . action . GET_LIST_TIMELINE ) {
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 ;
}
}
2017-05-05 16:36:04 +02:00
}