diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java index 5fe224f26..fd6513ac3 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java @@ -196,7 +196,7 @@ public abstract class BaseMainActivity extends BaseActivity private Stack stackBack = new Stack<>(); public static List filters = new ArrayList<>(); private DisplayStatusFragment homeFragment, federatedFragment, localFragment, artFragment; - private DisplayNotificationsFragment notificationsFragment; + private TabLayoutNotificationsFragment tabLayoutNotificationsFragment; private static final int ERROR_DIALOG_REQUEST_CODE = 97; private boolean display_direct, display_local, display_global, display_art; @@ -496,7 +496,7 @@ public abstract class BaseMainActivity extends BaseActivity @Override public boolean onLongClick(View v) { //Only shown if the tab has focus - if( notificationsFragment != null && notificationsFragment.getUserVisibleHint()){ + if( tabLayoutNotificationsFragment != null && tabLayoutNotificationsFragment.getUserVisibleHint()){ PopupMenu popup = new PopupMenu(BaseMainActivity.this, tabStrip.getChildAt(1)); popup.getMenuInflater() .inflate(R.menu.option_filter_notifications, popup.getMenu()); @@ -516,8 +516,8 @@ public abstract class BaseMainActivity extends BaseActivity popup.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { - if( notificationsFragment != null) - notificationsFragment.refreshAll(); + if( tabLayoutNotificationsFragment != null) + tabLayoutNotificationsFragment.refreshAll(); } }); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @@ -2042,8 +2042,8 @@ public abstract class BaseMainActivity extends BaseActivity if( lastHomeId != null && homeFragment != null){ homeFragment.retrieveMissingToots(lastHomeId); } - if( lastNotificationId != null && notificationsFragment != null){ - notificationsFragment.retrieveMissingNotifications(lastNotificationId); + if( lastNotificationId != null && tabLayoutNotificationsFragment != null){ + tabLayoutNotificationsFragment.retrieveMissingNotifications(lastNotificationId); } } @@ -2482,7 +2482,7 @@ public abstract class BaseMainActivity extends BaseActivity homeFragment.setArguments(bundle); return homeFragment; } else if (position == 1) { - TabLayoutNotificationsFragment tabLayoutNotificationsFragment = new TabLayoutNotificationsFragment(); + tabLayoutNotificationsFragment = new TabLayoutNotificationsFragment(); return tabLayoutNotificationsFragment; } else { statusFragment = new DisplayStatusFragment(); 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 6fe398ab0..a11ad0b1d 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 @@ -16,7 +16,6 @@ package fr.gouv.etalab.mastodon.asynctasks; import android.content.Context; import android.os.AsyncTask; -import android.util.Log; import java.lang.ref.WeakReference; @@ -27,7 +26,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.GNUAPI; import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment; -import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveNotificationsInterface; @@ -62,7 +60,6 @@ public class RetrieveNotificationsAsyncTask extends AsyncTask @Override protected Void doInBackground(Void... params) { - Log.v(Helper.TAG,"MainActivity.social : " + MainActivity.social ); if(MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU) { API api; if (account == null) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java index e9a1d6017..83f0eb16c 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java @@ -134,6 +134,11 @@ public class API { } public API(Context context) { this.context = context; + if( context == null) { + APIError = new Error(); + APIError.setError(context.getString(R.string.toast_error)); + return; + } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); tootPerPage = sharedpreferences.getInt(Helper.SET_TOOTS_PER_PAGE, 40); accountPerPage = sharedpreferences.getInt(Helper.SET_ACCOUNTS_PER_PAGE, 40); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java index bffb79525..702418489 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; import org.json.JSONArray; import org.json.JSONException; @@ -1495,6 +1494,7 @@ public class GNUAPI { private APIResponse getNotifications(DisplayNotificationsFragment.Type type, String max_id, String since_id, int limit, boolean display){ HashMap params = new HashMap<>(); + String stringType = null; if( max_id != null ) params.put("_", max_id); if( since_id != null ) @@ -1502,16 +1502,60 @@ public class GNUAPI { if( 0 > limit || limit > 30) limit = 30; params.put("count",String.valueOf(limit)); - params.put("namespace","qvitter"); List notifications = new ArrayList<>(); - + String url = null; + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + //Current user + String currentToken = sharedpreferences.getString(PREF_KEY_OAUTH_TOKEN, null); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account account = new AccountDAO(context, db).getAccountByToken(currentToken); + if(type == DisplayNotificationsFragment.Type.MENTION){ + params.put("name",account.getAcct()); + url = getAbsoluteUrl("/statuses/mentions_timeline.json"); + stringType = "mention"; + }else if(type == DisplayNotificationsFragment.Type.BOOST){ + url = getAbsoluteUrl("/statuses/retweets_of_me.json"); + stringType = "reblog"; + }else if(type == DisplayNotificationsFragment.Type.FOLLOW){ + url = getAbsoluteUrl("/statuses/followers.json"); + stringType = "follow"; + } + if( url == null){ + Error error = new Error(); + error.setStatusCode(500); + error.setError(context.getString(R.string.toast_error)); + apiResponse.setError(error); + return apiResponse; + } try { HttpsConnection httpsConnection = new HttpsConnection(context); - String response = httpsConnection.get(getAbsoluteUrl("/qvitter/statuses/notifications.json"), 60, params, prefKeyOauthTokenT); - Log.v(Helper.TAG,"response= " + response); + String response = httpsConnection.get(url, 60, params, prefKeyOauthTokenT); apiResponse.setSince_id(httpsConnection.getSince_id()); apiResponse.setMax_id(httpsConnection.getMax_id()); - notifications = parseNotificationResponse(new JSONArray(response)); + List statuses = parseStatuses(context, new JSONArray(response)); + List accounts = parseAccountResponse(new JSONArray(response)); + if(type == DisplayNotificationsFragment.Type.FOLLOW){ + if( accounts != null) + for(Account st: accounts ){ + Notification notification = new Notification(); + notification.setType(stringType); + notification.setId(st.getId()); + notification.setStatus(null); + notification.setAccount(account); + notifications.add(notification); + } + }else { + if( statuses != null) + for(Status st: statuses ){ + Notification notification = new Notification(); + notification.setType(stringType); + notification.setId(st.getId()); + notification.setStatus(st); + notification.setAccount(st.getAccount()); + notifications.add(notification); + } + } + } catch (HttpsConnection.HttpsConnectionException e) { setError(e.getStatusCode(), e); e.printStackTrace(); @@ -1865,7 +1909,10 @@ public class GNUAPI { Account account = new Account(); try { account.setId(resobj.get("id").toString()); - account.setUuid(resobj.get("ostatus_uri").toString()); + if( resobj.has("ostatus_uri")) + account.setUuid(resobj.get("ostatus_uri").toString()); + else + account.setUuid(resobj.get("id").toString()); account.setUsername(resobj.get("name").toString()); account.setAcct(resobj.get("name").toString()); account.setDisplay_name(resobj.get("screen_name").toString()); @@ -1880,8 +1927,13 @@ public class GNUAPI { account.setUrl(resobj.get("url").toString()); account.setAvatar(resobj.get("profile_image_url_https").toString()); account.setAvatar_static(resobj.get("profile_image_url_https").toString()); - account.setHeader(resobj.get("background_image").toString()); - account.setHeader_static(resobj.get("background_image").toString()); + if( !resobj.isNull("background_image")) { + account.setHeader(resobj.get("background_image").toString()); + account.setHeader_static(resobj.get("background_image").toString()); + }else{ + account.setHeader("null"); + account.setHeader_static("null"); + } account.setSocial("GNU"); account.setEmojis(new ArrayList<>()); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/TabLayoutNotificationsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/TabLayoutNotificationsFragment.java index cde227b46..b8340e8d9 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/TabLayoutNotificationsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/TabLayoutNotificationsFragment.java @@ -13,6 +13,7 @@ package fr.gouv.etalab.mastodon.fragments; * * You should have received a copy of the GNU General Public License along with Mastalab; if not, * see . */ + import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; @@ -47,13 +48,14 @@ import static fr.gouv.etalab.mastodon.helper.Helper.THEME_LIGHT; public class TabLayoutNotificationsFragment extends Fragment { private Context context; + private ViewPager viewPager; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getContext(); - View inflatedView = inflater.inflate(R.layout.tablayout_settings, container, false); + View inflatedView = inflater.inflate(R.layout.tablayout_notifications, container, false); TabLayout tabLayout = inflatedView.findViewById(R.id.tabLayout); @@ -66,10 +68,14 @@ public class TabLayoutNotificationsFragment extends Fragment { TabLayout.Tab tabFollow = tabLayout.newTab(); tabMention.setCustomView(R.layout.tab_badge); - tabFav.setCustomView(R.layout.tab_badge); + if(MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU) + tabFav.setCustomView(R.layout.tab_badge); tabBoost.setCustomView(R.layout.tab_badge); tabFollow.setCustomView(R.layout.tab_badge); - + + + + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); @@ -78,18 +84,28 @@ public class TabLayoutNotificationsFragment extends Fragment { iconMention.setImageResource(R.drawable.ic_mention_notif_tab); - @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId") - ImageView iconFav = tabMention.getCustomView().findViewById(R.id.tab_icon); - iconFav.setImageResource(R.drawable.ic_star_notif_tab); + ImageView iconFav =null; + if( tabFav.getCustomView() != null) { + iconFav = tabFav.getCustomView().findViewById(R.id.tab_icon); + iconFav.setImageResource(R.drawable.ic_star_notif_tab); + } @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId") - ImageView iconBoost = tabMention.getCustomView().findViewById(R.id.tab_icon); + ImageView iconBoost = tabBoost.getCustomView().findViewById(R.id.tab_icon); iconBoost.setImageResource(R.drawable.ic_repeat_notif_tab); @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId") - ImageView iconFollow = tabMention.getCustomView().findViewById(R.id.tab_icon); + ImageView iconFollow = tabFollow.getCustomView().findViewById(R.id.tab_icon); iconFollow.setImageResource(R.drawable.ic_follow_notif_tab); + + + tabLayout.addTab(tabMention); + if( tabFav.getCustomView() != null) + tabLayout.addTab(tabFav); + tabLayout.addTab(tabBoost); + tabLayout.addTab(tabFollow); + if (theme == THEME_BLACK) iconMention.setColorFilter(ContextCompat.getColor(context, R.color.dark_icon), PorterDuff.Mode.SRC_IN); else @@ -97,18 +113,19 @@ public class TabLayoutNotificationsFragment extends Fragment { if (theme == THEME_LIGHT) { iconMention.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN); - iconFav.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN); + if( iconFav != null) + iconFav.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN); iconBoost.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN); iconFollow.setColorFilter(ContextCompat.getColor(context, R.color.action_light_header), PorterDuff.Mode.SRC_IN); } else { iconMention.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN); - iconFav.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN); + if( iconFav != null) + iconFav.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN); iconBoost.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN); iconFollow.setColorFilter(ContextCompat.getColor(context, R.color.dark_text), PorterDuff.Mode.SRC_IN); } - - final ViewPager viewPager = inflatedView.findViewById(R.id.viewpager); + viewPager = inflatedView.findViewById(R.id.viewpager); viewPager.setAdapter(new PagerAdapter (getChildFragmentManager(), tabLayout.getTabCount())); @@ -154,30 +171,28 @@ public class TabLayoutNotificationsFragment extends Fragment { public Fragment getItem(int position) { DisplayNotificationsFragment displayNotificationsFragment = new DisplayNotificationsFragment(); DisplayNotificationsFragment.Type type = null; + String tag = ""; switch (position) { case 0: - if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU ) + if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU ) { type = DisplayNotificationsFragment.Type.ALL; - else + }else type = DisplayNotificationsFragment.Type.MENTION; break; case 1: if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU ) type = DisplayNotificationsFragment.Type.MENTION; else - type = DisplayNotificationsFragment.Type.FAVORITE; + type = DisplayNotificationsFragment.Type.BOOST; break; case 2: if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU ) type = DisplayNotificationsFragment.Type.FAVORITE; else - type = DisplayNotificationsFragment.Type.BOOST; + type = DisplayNotificationsFragment.Type.FOLLOW; break; case 3: - if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU ) - type = DisplayNotificationsFragment.Type.BOOST; - else - type = DisplayNotificationsFragment.Type.FOLLOW; + type = DisplayNotificationsFragment.Type.BOOST; break; case 4: type = DisplayNotificationsFragment.Type.FOLLOW; @@ -192,9 +207,27 @@ public class TabLayoutNotificationsFragment extends Fragment { return displayNotificationsFragment; } + @Override public int getCount() { return mNumOfTabs; } } + + public void refreshAll(){ + + FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); + if( a != null) { + DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); + notifAll.refreshAll(); + } + } + + public void retrieveMissingNotifications(String sinceId){ + FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); + if( a != null) { + DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); + notifAll.retrieveMissingNotifications(sinceId); + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/tablayout_notifications.xml b/app/src/main/res/layout/tablayout_notifications.xml new file mode 100644 index 000000000..89b15710a --- /dev/null +++ b/app/src/main/res/layout/tablayout_notifications.xml @@ -0,0 +1,40 @@ + + + + + + + + + \ No newline at end of file