diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java index 3e5bf8a02..41326ddac 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java @@ -21,6 +21,7 @@ import java.lang.ref.WeakReference; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface; diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java index 74185f3c2..408c787b0 100644 --- a/app/src/main/java/app/fedilab/android/client/API.java +++ b/app/src/main/java/app/fedilab/android/client/API.java @@ -1015,34 +1015,40 @@ public class API { SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); statuses = new TimelineCacheDAO(context, db).get(max_id); - if( statuses != null){ - Iterator i = statuses.iterator(); - List ids = new ArrayList<>(); - while (i.hasNext()) { - Status s = i.next(); - if( ids.contains(s.getId())) { - i.remove(); - new TimelineCacheDAO(context, db).remove(s.getId()); - }else{ - ids.add(s.getId()); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean remember_position_home = sharedpreferences.getBoolean(Helper.SET_REMEMBER_POSITION_HOME, true); + //TODO: remove forced condition + if( remember_position_home ){ + if( statuses != null){ + Iterator i = statuses.iterator(); + List ids = new ArrayList<>(); + while (i.hasNext()) { + Status s = i.next(); + if( ids.contains(s.getId())) { + i.remove(); + new TimelineCacheDAO(context, db).remove(s.getId()); + }else{ + ids.add(s.getId()); + } } } - } - - if( statuses == null){ - return getHomeTimeline(max_id); + if( statuses == null){ + return getHomeTimeline(max_id); + }else{ + if( statuses.size() > 0) { + if( statuses.get(0).getId().matches("\\d+")){ + apiResponse.setSince_id(String.valueOf(Long.parseLong(statuses.get(0).getId())+1)); + apiResponse.setMax_id(String.valueOf(Long.parseLong(statuses.get(statuses.size() - 1).getId())-1)); + }else{ + apiResponse.setSince_id(statuses.get(0).getId()); + apiResponse.setMax_id(statuses.get(statuses.size() - 1).getId()); + } + } + apiResponse.setStatuses(statuses); + return apiResponse; + } }else{ - if( statuses.size() > 0) { - if( statuses.get(0).getId().matches("\\d+")){ - apiResponse.setSince_id(String.valueOf(Long.parseLong(statuses.get(0).getId())+1)); - apiResponse.setMax_id(String.valueOf(Long.parseLong(statuses.get(statuses.size() - 1).getId())-1)); - }else{ - apiResponse.setSince_id(statuses.get(0).getId()); - apiResponse.setMax_id(statuses.get(statuses.size() - 1).getId()); - } - } - apiResponse.setStatuses(statuses); - return apiResponse; + return getHomeTimeline(max_id); } } diff --git a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java index 5013383bc..15819ce9c 100644 --- a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java @@ -17,7 +17,6 @@ package app.fedilab.android.client; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; -import android.util.Log; import org.json.JSONArray; import org.json.JSONException; diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java index 98db8395a..68237849c 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java @@ -540,7 +540,10 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn //Only for the Home timeline if( type == RetrieveFeedsAsyncTask.Type.HOME && !firstTootsLoaded){ - asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask(context, null, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + boolean remember_position_home = sharedpreferences.getBoolean(Helper.SET_REMEMBER_POSITION_HOME, true); + if( remember_position_home) { + asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask(context, null, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } firstTootsLoaded = true; } //Let's deal with statuses @@ -925,6 +928,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn @Override public void onRetrieveFeedsAfterBookmark(APIResponse apiResponse) { + if( statusListAdapter == null) return; if( apiResponse == null || (apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404) ){ @@ -937,10 +941,12 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn return; } List statuses = apiResponse.getStatuses(); + if( statuses == null || statuses.size() == 0 || this.statuses == null ) return; //Find the position of toots between those already present int position = 0; + if( position < this.statuses.size() && statuses.get(0).getCreated_at() != null && this.statuses.get(position).getCreated_at() != null) { while (position < this.statuses.size() && statuses.get(0).getCreated_at().before(this.statuses.get(position).getCreated_at())) { position++; @@ -949,7 +955,9 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn ArrayList tmpStatuses = new ArrayList<>(); for (Status tmpStatus : statuses) { //Put the toot at its place in the list (id desc) - if( !this.statuses.contains(tmpStatus) ) { //Element not already added + if (this.statuses.size() == 0){ + tmpStatuses.add(tmpStatus); + }else if( tmpStatus.getCreated_at().after(this.statuses.get(0).getCreated_at())) { //Element not already added //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); @@ -1025,7 +1033,11 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if( !pagination) { if (type == RetrieveFeedsAsyncTask.Type.HOME) { if (context instanceof BaseMainActivity) { - asyncTask = new RetrieveFeedsAsyncTask(context, type, initialBookMark, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + 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); } } else { //Most classical search will be done by this call asyncTask = new RetrieveFeedsAsyncTask(context, type, null, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); diff --git a/app/src/main/java/app/fedilab/android/fragments/SettingsFragment.java b/app/src/main/java/app/fedilab/android/fragments/SettingsFragment.java index 3277466cc..15701a3ca 100644 --- a/app/src/main/java/app/fedilab/android/fragments/SettingsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/SettingsFragment.java @@ -464,6 +464,19 @@ public class SettingsFragment extends Fragment { } }); + boolean remember_position_home = sharedpreferences.getBoolean(Helper.SET_REMEMBER_POSITION_HOME, true); + final CheckBox set_remember_position = rootView.findViewById(R.id.set_remember_position); + set_remember_position.setChecked(remember_position_home); + + set_remember_position.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putBoolean(Helper.SET_REMEMBER_POSITION_HOME, set_remember_position.isChecked()); + editor.apply(); + } + }); + boolean old_direct_timeline = sharedpreferences.getBoolean(Helper.SET_OLD_DIRECT_TIMELINE, false); final CheckBox set_old_direct_timeline = rootView.findViewById(R.id.set_old_direct_timeline); set_old_direct_timeline.setChecked(old_direct_timeline); diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index e333e68a0..0568d54cf 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -328,6 +328,7 @@ public class Helper { public static final String SET_LONG_PRESS_MEDIA = "set_long_press_media"; public static final String SET_DISPLAY_TIMELINE_IN_LIST = "set_display_timeline_in_list"; public static final String SET_ONION_SCHEME = "set_onion_scheme"; + public static final String SET_REMEMBER_POSITION_HOME = "set_remember_position"; public static final int S_NO = 0; static final int S_512KO = 1; public static final int S_1MO = 2; diff --git a/app/src/main/res/layout-sw600dp/fragment_settings.xml b/app/src/main/res/layout-sw600dp/fragment_settings.xml index 6b5fe4c6b..9eaac67b9 100644 --- a/app/src/main/res/layout-sw600dp/fragment_settings.xml +++ b/app/src/main/res/layout-sw600dp/fragment_settings.xml @@ -98,6 +98,14 @@ android:background="?colorAccent" /> + + + + Display timelines Mark bot accounts in toots Manage tags + Remember the position in Home timeline %d vote