diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/HashTagActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/HashTagActivity.java index c3a02e8a0..1f0eafe14 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/HashTagActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/HashTagActivity.java @@ -158,7 +158,7 @@ public class HashTagActivity extends AppCompatActivity implements OnRetrieveFeed } @Override - public void onRetrieveFeeds(APIResponse apiResponse) { + public void onRetrieveFeeds(APIResponse apiResponse, boolean refreshData) { mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java index c5aa498b9..f6648ec1a 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MainActivity.java @@ -23,12 +23,10 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.PorterDuff; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; -import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -46,6 +44,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; +import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; import android.widget.LinearLayout; @@ -118,7 +117,8 @@ public class MainActivity extends AppCompatActivity private ViewPager viewPager; private RelativeLayout main_app_container; private Stack stackBack = new Stack<>(); - + private DisplayStatusFragment homeFragment; + private DisplayNotificationsFragment notificationsFragment; public MainActivity() { @@ -943,12 +943,13 @@ public class MainActivity extends AppCompatActivity Bundle bundle = new Bundle(); switch (position) { case 0: - statusFragment = new DisplayStatusFragment(); + homeFragment = new DisplayStatusFragment(); bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.HOME); - statusFragment.setArguments(bundle); - return statusFragment; + homeFragment.setArguments(bundle); + return homeFragment; case 1: - return new DisplayNotificationsFragment(); + notificationsFragment = new DisplayNotificationsFragment(); + return notificationsFragment; case 2: statusFragment = new DisplayStatusFragment(); bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.LOCAL); @@ -969,7 +970,7 @@ public class MainActivity extends AppCompatActivity } } - private void displayUnreadCounter(){ + private void refreshData(){ final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); String prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); @@ -979,11 +980,48 @@ public class MainActivity extends AppCompatActivity String last_refresh = sharedpreferences.getString(Helper.LAST_BUBBLE_REFRESH + account.getId(), null); Date last_refresh_date = Helper.stringToDate(getApplicationContext(), last_refresh); if (last_refresh_date == null || new Date().getTime() - last_refresh_date.getTime() >= TimeUnit.MINUTES.toMillis(5)) { - //Last read id for home - String since_id = sharedpreferences.getString(Helper.LAST_HOMETIMELINE_MAX_ID + account.getId(), null); + homeFragment.update(); + notificationsFragment.update(); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_BUBBLE_REFRESH+ account.getId(),Helper.dateToString(getApplicationContext(), new Date())); + editor.apply(); } } } + public void updateHomeCounter(int newHomeCount){ + if( tabLayout.getTabAt(0) == null ) + return; + View tabHome = tabLayout.getTabAt(0).getCustomView(); + TextView tabCounterHome = (TextView) tabHome.findViewById(R.id.tab_counter); + tabCounterHome.setText(newHomeCount); + if( newHomeCount > 0){ + //New data are available + //The fragment is not displayed, so the counter is displayed + if( tabLayout.getSelectedTabPosition() != 0) + tabCounterHome.setVisibility(View.VISIBLE); + else + tabCounterHome.setVisibility(View.GONE); + }else { + tabCounterHome.setVisibility(View.GONE); + } + } + + public void updateNotifCounter(int newNotifCount){ + if(tabLayout.getTabAt(1) == null) + return; + View tabNotif = tabLayout.getTabAt(1).getCustomView(); + TextView tabCounterNotif = (TextView) tabNotif.findViewById(R.id.tab_counter); + tabCounterNotif.setText(newNotifCount); + if( newNotifCount > 0){ + if( tabLayout.getSelectedTabPosition() != 1) + tabCounterNotif.setVisibility(View.VISIBLE); + else + tabCounterNotif.setVisibility(View.GONE); + }else { + tabCounterNotif.setVisibility(View.GONE); + } + } + } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java index 2eb2f5073..854565190 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java @@ -216,7 +216,7 @@ public class ShowConversationActivity extends AppCompatActivity implements OnRet } @Override - public void onRetrieveFeeds(APIResponse apiResponse) { + public void onRetrieveFeeds(APIResponse apiResponse, boolean refreshData) { if( apiResponse.getError() != null){ final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean show_error_messages = sharedpreferences.getBoolean(Helper.SET_SHOW_ERROR_MESSAGES, true); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java index ec191247a..c36d9e787 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java @@ -36,6 +36,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { private String targetedID; private String tag; private boolean showMediaOnly = false; + private boolean refreshData; public enum Type{ HOME, @@ -54,6 +55,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { this.action = action; this.max_id = max_id; this.listener = onRetrieveFeedsInterface; + this.refreshData = true; } public RetrieveFeedsAsyncTask(Context context, Type action, String targetedID, String max_id, boolean showMediaOnly, OnRetrieveFeedsInterface onRetrieveFeedsInterface){ @@ -63,6 +65,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { this.listener = onRetrieveFeedsInterface; this.targetedID = targetedID; this.showMediaOnly = showMediaOnly; + this.refreshData = true; } public RetrieveFeedsAsyncTask(Context context, Type action, String tag, String targetedID, String max_id, OnRetrieveFeedsInterface onRetrieveFeedsInterface){ this.context = context; @@ -71,7 +74,17 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { this.listener = onRetrieveFeedsInterface; this.targetedID = targetedID; this.tag = tag; + this.refreshData = true; } + + public RetrieveFeedsAsyncTask(Context context, Type action, String max_id, boolean refreshData, OnRetrieveFeedsInterface onRetrieveFeedsInterface){ + this.context = context; + this.action = action; + this.max_id = max_id; + this.listener = onRetrieveFeedsInterface; + this.refreshData = refreshData; + } + @Override protected Void doInBackground(Void... params) { @@ -109,7 +122,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { @Override protected void onPostExecute(Void result) { - listener.onRetrieveFeeds(apiResponse); + listener.onRetrieveFeeds(apiResponse, refreshData); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveNotificationsAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveNotificationsAsyncTask.java index a76651505..514fdd55f 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveNotificationsAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveNotificationsAsyncTask.java @@ -35,7 +35,7 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask private OnRetrieveNotificationsInterface listener; private String instance; private String token; - + private boolean refreshData; public RetrieveNotificationsAsyncTask(Context context, String instance, String token, String max_id, String acct, String userId, OnRetrieveNotificationsInterface onRetrieveNotificationsInterface){ this.context = context; @@ -45,6 +45,18 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask this.instance = instance; this.userId = userId; this.token = token; + this.refreshData = true; + } + + public RetrieveNotificationsAsyncTask(Context context, String instance, String token, String max_id, String acct, String userId, boolean refreshData, OnRetrieveNotificationsInterface onRetrieveNotificationsInterface){ + this.context = context; + this.max_id = max_id; + this.listener = onRetrieveNotificationsInterface; + this.acct = acct; + this.instance = instance; + this.userId = userId; + this.token = token; + this.refreshData = refreshData; } @Override @@ -60,7 +72,7 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask @Override protected void onPostExecute(Void result) { - listener.onRetrieveNotifications(apiResponse, acct, userId); + listener.onRetrieveNotifications(apiResponse, acct, userId, refreshData); } } 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 02671dc67..1828815a0 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 @@ -31,8 +31,10 @@ import android.widget.Toast; import java.util.ArrayList; import java.util.List; +import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.drawers.NotificationsListAdapter; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; @@ -63,6 +65,10 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve private int notificationPerPage; private boolean swiped; private ListView lv_notifications; + private int newElements; + private DisplayNotificationsFragment displayNotificationsFragment; + private List notificationsTemp; + private String new_max_id; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -74,7 +80,8 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve flag_loading = true; notifications = new ArrayList<>(); swiped = false; - + newElements = 0; + displayNotificationsFragment = this; swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipeContainer); SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); notificationPerPage = sharedpreferences.getInt(Helper.SET_NOTIFICATIONS_PER_PAGE, 15); @@ -153,7 +160,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve @Override - public void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId) { + 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); @@ -166,7 +173,28 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve swiped = false; return; } + String old_max_id = max_id; + new_max_id = apiResponse.getMax_id(); List notifications = apiResponse.getNotifications(); + if( refreshData || !displayNotificationsFragment.isVisible()) { + manageNotifications(notifications, new_max_id); + if( !displayNotificationsFragment.isVisible()){ + int countData = 0; + for(Notification nt : notifications){ + if( nt.getId().equals(old_max_id)) + break; + countData++; + } + ((MainActivity)getActivity()).updateNotifCounter(countData); + } + }else { + notificationsTemp = notifications; + } + + } + + private void manageNotifications(List notifications, String max_id){ + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); if( !swiped && firstLoad && (notifications == null || notifications.size() == 0)) textviewNoAction.setVisibility(View.VISIBLE); else @@ -178,7 +206,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve lv_notifications.setAdapter(notificationsListAdapter); swiped = false; } - max_id = apiResponse.getMax_id(); + if( notifications != null && notifications.size() > 0) { for(Notification tmpNotification: notifications){ @@ -191,7 +219,7 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve //Store last notification id to avoid to notify for those that have been already seen if( notifications != null && notifications.size() > 0) { //acct is null as userId when used in Fragment, data need to be retrieved via shared preferences and db - userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); Account currentAccount = new AccountDAO(context, db).getAccountByID(userId); if( currentAccount != null && firstLoad){ @@ -207,4 +235,8 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve if( lv_notifications != null) lv_notifications.setAdapter(notificationsListAdapter); } + + public void update(){ + asyncTask = new RetrieveNotificationsAsyncTask(context, null, null, max_id, null, null, !displayNotificationsFragment.isVisible(), DisplayNotificationsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } } 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 97ddcc4e7..ae69fa0d5 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 @@ -33,6 +33,7 @@ import android.widget.Toast; import java.util.ArrayList; import java.util.List; +import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.asynctasks.RetrieveRepliesAsyncTask; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; @@ -73,6 +74,10 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private int behaviorWithAttachments; private String instanceValue; private boolean showMediaOnly; + private int newElements; + private DisplayStatusFragment displayStatusFragment; + private List statusesTemp; + private String new_max_id; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -104,6 +109,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn flag_loading = true; firstLoad = true; swiped = false; + newElements = 0; + displayStatusFragment = this; isOnWifi = Helper.isOnWIFI(context); swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipeContainer); @@ -215,7 +222,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn @Override - public void onRetrieveFeeds(APIResponse apiResponse) { + public void onRetrieveFeeds(APIResponse apiResponse, boolean refreshData) { mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); //Discards 404 - error which can often happen due to toots which have been deleted @@ -229,8 +236,29 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn flag_loading = false; return; } - flag_loading = (apiResponse.getMax_id() == null ); List statuses = apiResponse.getStatuses(); + String old_max_id = max_id; + new_max_id = apiResponse.getMax_id(); + + if( refreshData || !displayStatusFragment.isVisible()) { + manageStatus(statuses, max_id); + if( !displayStatusFragment.isVisible()){ + int countData = 0; + for(Status st : statuses){ + if( st.getId().equals(old_max_id)) + break; + countData++; + } + ((MainActivity)getActivity()).updateNotifCounter(countData); + } + }else { + statusesTemp = statuses; + } + + } + + private void manageStatus(List statuses, String max_id){ + flag_loading = (max_id == null ); if( !swiped && firstLoad && (statuses == null || statuses.size() == 0)) textviewNoAction.setVisibility(View.VISIBLE); else @@ -240,7 +268,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn lv_status.setAdapter(statusListAdapter); swiped = false; } - max_id = apiResponse.getMax_id(); if( statuses != null && statuses.size() > 0) { for(Status tmpStatus: statuses){ this.statuses.add(tmpStatus); @@ -273,7 +300,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn new RetrieveRepliesAsyncTask(context, statuses, DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } - } public void scrollToTop(){ @@ -295,4 +321,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn } statusListAdapter.notifyDataSetChanged(); } + public void update() { + asyncTask = new RetrieveFeedsAsyncTask(context, type, max_id, !displayStatusFragment.isVisible(), DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveFeedsInterface.java b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveFeedsInterface.java index 8ca4df95c..d7e656c78 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveFeedsInterface.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveFeedsInterface.java @@ -21,5 +21,5 @@ import fr.gouv.etalab.mastodon.client.APIResponse; * Interface when status have been retrieved */ public interface OnRetrieveFeedsInterface { - void onRetrieveFeeds(APIResponse apiResponse); + void onRetrieveFeeds(APIResponse apiResponse, boolean refreshData); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveNotificationsInterface.java b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveNotificationsInterface.java index 027e6c4de..36ccad626 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveNotificationsInterface.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveNotificationsInterface.java @@ -21,5 +21,5 @@ import fr.gouv.etalab.mastodon.client.APIResponse; * Interface when notifications have been retrieved */ public interface OnRetrieveNotificationsInterface { - void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId); + void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId, boolean refreshData); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java index d05321e7f..43df6d2e0 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java @@ -133,7 +133,7 @@ public class NotificationsSyncJob extends Job implements OnRetrieveNotifications @Override - public void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId) { + public void onRetrieveNotifications(APIResponse apiResponse, String acct, String userId, boolean refreshData) { List notifications = apiResponse.getNotifications(); if( apiResponse.getError() != null || notifications == null || notifications.size() == 0) diff --git a/app/src/main/res/layout/tab_badge.xml b/app/src/main/res/layout/tab_badge.xml index 4bc5da171..e1657bbd8 100644 --- a/app/src/main/res/layout/tab_badge.xml +++ b/app/src/main/res/layout/tab_badge.xml @@ -25,6 +25,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" />