diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayNotificationsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayNotificationsFragment.java index 352b12298..d1aad66b8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayNotificationsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayNotificationsFragment.java @@ -66,6 +66,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve private RecyclerView lv_notifications; private String lastReadNotifications; private String userId; + private SharedPreferences sharedpreferences; LinearLayoutManager mLayoutManager; public DisplayNotificationsFragment(){ @@ -81,9 +82,10 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve flag_loading = true; notifications = new ArrayList<>(); swiped = false; - swipeRefreshLayout = rootView.findViewById(R.id.swipeContainer); - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + + lv_notifications = rootView.findViewById(R.id.lv_notifications); lv_notifications.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL)); mainLoader = rootView.findViewById(R.id.loader); @@ -171,7 +173,6 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve @Override public void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId, boolean refreshData) { - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); if( apiResponse.getError() != null){ @@ -211,11 +212,14 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve } if( firstLoad) { //Update the id of the last notification retrieved - MainActivity.lastNotificationId = notifications.get(0).getId(); - if (notifications.size() > 0) - updateNotificationLastId(sharedpreferences, this.userId, notifications.get(0).getId()); + if( MainActivity.lastNotificationId == null || Long.parseLong(notifications.get(0).getId()) > Long.parseLong(MainActivity.lastNotificationId)) + MainActivity.lastNotificationId = notifications.get(0).getId(); + updateNotificationLastId(notifications.get(0).getId()); } notificationsListAdapter.notifyItemRangeInserted(previousPosition, notifications.size()); + }else { + if( firstLoad) + textviewNoAction.setVisibility(View.VISIBLE); } if( firstLoad ) ((MainActivity)context).updateNotifCounter(); @@ -239,9 +243,8 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve if( context == null) return; //Store last notification id to avoid to notify for those that have been already seen - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if (visible && notifications != null && notifications.size() > 0) { - updateNotificationLastId(sharedpreferences, this.userId, notifications.get(0).getId()); + updateNotificationLastId(notifications.get(0).getId()); } } @@ -249,10 +252,8 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve if( lv_notifications != null) lv_notifications.setAdapter(notificationsListAdapter); //Store last toot id for home timeline to avoid to notify for those that have been already seen - //Store last notification id to avoid to notify for those that have been already seen - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if (this.notifications != null && this.notifications.size() > 0) { - updateNotificationLastId(sharedpreferences, this.userId, this.notifications.get(0).getId()); + updateNotificationLastId(this.notifications.get(0).getId()); } } @@ -313,17 +314,15 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve /** * Records the id of the notification only if its greater than the previous one. - * @param sharedPreferences SharedPreferences - * @param userId String current logged user * @param notificationId String current notification id to check */ - private void updateNotificationLastId(SharedPreferences sharedPreferences, String userId, String notificationId){ + private void updateNotificationLastId(String notificationId){ - - String lastNotif = sharedPreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); + String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); if( lastNotif == null || Long.parseLong(notificationId) > Long.parseLong(lastNotif)){ this.lastReadNotifications = notificationId; - SharedPreferences.Editor editor = sharedPreferences.edit(); + MainActivity.countNewNotifications = 0; + SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + userId, notificationId); editor.apply(); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java index 3b05e8398..b4dd7c09f 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java @@ -73,6 +73,9 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private Intent streamingFederatedIntent, streamingLocalIntent; LinearLayoutManager mLayoutManager; boolean firstTootsLoaded; + private String lastReadStatus; + private String userId; + private SharedPreferences sharedpreferences; public DisplayStatusFragment(){ } @@ -99,7 +102,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn firstLoad = true; swiped = false; assert context != null; - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean isOnWifi = Helper.isOnWIFI(context); int positionSpinnerTrans = sharedpreferences.getInt(Helper.SET_TRANSLATOR, Helper.TRANS_YANDEX); swipeRefreshLayout = rootView.findViewById(R.id.swipeContainer); @@ -114,7 +117,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn lv_status.setAdapter(statusListAdapter); mLayoutManager = new LinearLayoutManager(context); lv_status.setLayoutManager(mLayoutManager); - + userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + lastReadStatus = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); lv_status.addOnScrollListener(new RecyclerView.OnScrollListener() { public void onScrolled(RecyclerView recyclerView, int dx, int dy) @@ -142,7 +146,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if(statuses != null && statuses.size() > firstVisibleItem ) if( context instanceof BaseMainActivity){ SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); Long bookmarkL = Long.parseLong(statuses.get(firstVisibleItem).getId()) + 1; editor.putString(Helper.BOOKMARK_ID + userId, String.valueOf(bookmarkL)); editor.apply(); @@ -249,7 +252,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); //Discards 404 - error which can often happen due to toots which have been deleted - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if( apiResponse.getError() != null ){ boolean show_error_messages = sharedpreferences.getBoolean(Helper.SET_SHOW_ERROR_MESSAGES, true); if( show_error_messages && !apiResponse.getError().getError().startsWith("404 -")) @@ -298,7 +300,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn this.statuses.addAll(statuses); statusListAdapter.notifyItemRangeInserted(previousPosition, statuses.size()); }else { //Toots are younger than the bookmark - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); String currentMaxId = sharedpreferences.getString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, null); int position = 0; while (position < this.statuses.size() && Long.parseLong(statuses.get(0).getId()) < Long.parseLong(this.statuses.get(position).getId())) { @@ -334,10 +335,12 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn this.statuses.addAll(statuses); statusListAdapter.notifyItemRangeInserted(previousPosition, statuses.size()); } - if( firstLoad && type == RetrieveFeedsAsyncTask.Type.HOME && statuses.size() > 0) { + if( type == RetrieveFeedsAsyncTask.Type.HOME ) { //Update the id of the last toot retrieved - MainActivity.lastHomeId = statuses.get(0).getId(); - updateMaxId(statuses.get(0).getId()); + if( MainActivity.lastHomeId == null || Long.parseLong(statuses.get(0).getId()) > Long.parseLong(MainActivity.lastHomeId)) + MainActivity.lastHomeId = statuses.get(0).getId(); + if( firstLoad ) + updateNotificationLastId(statuses.get(0).getId()); } if( type == RetrieveFeedsAsyncTask.Type.HOME) //Display new value in counter @@ -363,17 +366,18 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn && Long.parseLong(status.getId()) > Long.parseLong(statuses.get(0).getId())) { if (type == RetrieveFeedsAsyncTask.Type.HOME) { - //Update the id of the last toot retrieved - MainActivity.lastHomeId = status.getId(); - status.setReplies(new ArrayList()); - statuses.add(0, status); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - if (!status.getAccount().getId().equals(userId)) - MainActivity.countNewStatus++; - statusListAdapter.notifyItemInserted(0); - if (textviewNoAction.getVisibility() == View.VISIBLE) - textviewNoAction.setVisibility(View.GONE); + //Makes sure the status is not already displayed + if( lastReadStatus == null || Long.parseLong(status.getId()) > Long.parseLong(lastReadStatus)) { + //Update the id of the last toot retrieved + MainActivity.lastHomeId = status.getId(); + status.setReplies(new ArrayList()); + statuses.add(0, status); + if (!status.getAccount().getId().equals(userId)) + MainActivity.countNewStatus++; + statusListAdapter.notifyItemInserted(0); + if (textviewNoAction.getVisibility() == View.VISIBLE) + textviewNoAction.setVisibility(View.GONE); + } } else if (type == RetrieveFeedsAsyncTask.Type.PUBLIC || type == RetrieveFeedsAsyncTask.Type.LOCAL) { @@ -405,9 +409,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if( type == RetrieveFeedsAsyncTask.Type.PUBLIC){ if( getUserVisibleHint() ){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_FEDERATED+userId, true); editor.apply(); streamingFederatedIntent = new Intent(context, StreamingFederatedTimelineService.class); @@ -418,9 +420,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn }else if (type == RetrieveFeedsAsyncTask.Type.LOCAL){ if( getUserVisibleHint() ){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL+userId, true); editor.apply(); streamingLocalIntent = new Intent(context, StreamingLocalTimelineService.class); @@ -450,12 +450,10 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn return; //Store last toot id for home timeline to avoid to notify for those that have been already seen if (type == RetrieveFeedsAsyncTask.Type.HOME && visible && statuses != null && statuses.size() > 0) { - updateMaxId(statuses.get(0).getId()); + updateNotificationLastId(statuses.get(0).getId()); } else if( type == RetrieveFeedsAsyncTask.Type.PUBLIC ){ if (visible) { - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_FEDERATED+userId, true); editor.apply(); streamingFederatedIntent = new Intent(context, StreamingFederatedTimelineService.class); @@ -464,9 +462,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn retrieveMissingToots(statuses.get(0).getId()); }else { if( streamingFederatedIntent != null ){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_FEDERATED+userId, false); editor.apply(); context.stopService(streamingFederatedIntent); @@ -474,9 +470,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn } }else if (type == RetrieveFeedsAsyncTask.Type.LOCAL){ if (visible) { - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL+userId, true); editor.apply(); streamingLocalIntent = new Intent(context, StreamingLocalTimelineService.class); @@ -485,9 +479,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn retrieveMissingToots(statuses.get(0).getId()); }else { if( streamingLocalIntent != null ){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL+userId, false); editor.apply(); context.stopService(streamingLocalIntent); @@ -500,16 +492,12 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn public void onStop(){ super.onStop(); if( type == RetrieveFeedsAsyncTask.Type.PUBLIC && streamingFederatedIntent != null){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_FEDERATED+userId, false); editor.apply(); context.stopService(streamingFederatedIntent); }else if(type == RetrieveFeedsAsyncTask.Type.LOCAL && streamingLocalIntent != null){ - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); editor.putBoolean(Helper.SHOULD_CONTINUE_STREAMING_LOCAL+userId, false); editor.apply(); context.stopService(streamingLocalIntent); @@ -521,7 +509,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn lv_status.setAdapter(statusListAdapter); //Store last toot id for home timeline to avoid to notify for those that have been already seen if (type == RetrieveFeedsAsyncTask.Type.HOME && statuses != null && statuses.size() > 0) { - updateMaxId(statuses.get(0).getId()); + updateNotificationLastId(statuses.get(0).getId()); } } } @@ -538,8 +526,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn inserted++; statuses.get(i).setReplies(new ArrayList()); this.statuses.add(0, statuses.get(i)); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); if (type == RetrieveFeedsAsyncTask.Type.HOME && !statuses.get(i).getAccount().getId().equals(userId)) MainActivity.countNewStatus++; } @@ -558,15 +544,19 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - private void updateMaxId(String max_id){ - if( max_id == null) - return; - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - String currentMaxId = sharedpreferences.getString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, null); - if( currentMaxId == null || Long.parseLong(max_id) > Long.parseLong(currentMaxId)) { + + /** + * Records the id of the status only if its greater than the previous one. + * @param statusId String current status id to check + */ + private void updateNotificationLastId(String statusId){ + + String lastNotif = sharedpreferences.getString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, null); + if( lastNotif == null || Long.parseLong(statusId) > Long.parseLong(lastNotif)){ + this.lastReadStatus = statusId; + MainActivity.countNewStatus = 0; SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, max_id); + editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, statusId); editor.apply(); } }