Loading app/src/main/java/app/fedilab/android/client/endpoints/MastodonTimelinesService.java +13 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,19 @@ public interface MastodonTimelinesService { @Query("limit") Integer limit ); @GET("timelines/bubble") Call<List<Status>> getBubble( @Header("Authorization") String token, @Query("only_media") Boolean only_media, @Query("remote") Boolean remote, @Query("with_muted") Boolean with_muted, @Query("exclude_visibilities") List<String> exclude_visibilities, @Query("reply_visibility") String reply_visibility, @Query("max_id") String max_id, @Query("since_id") String since_id, @Query("min_id") String min_id, @Query("limit") Integer limit ); @GET("trends/statuses") Call<List<Status>> getStatusTrends( Loading app/src/main/java/app/fedilab/android/client/entities/app/Timeline.java +2 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,8 @@ public class Timeline { LOCAL("LOCAL"), @SerializedName("PUBLIC") PUBLIC("PUBLIC"), @SerializedName("BUBBLE") BUBBLE("BUBBLE"), @SerializedName("CONTEXT") CONTEXT("CONTEXT"), @SerializedName("TAG") Loading app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +34 −58 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static app.fedilab.android.BaseMainActivity.show_replies; import static app.fedilab.android.ui.pageadapter.FedilabPageAdapter.BOTTOM_TIMELINE_COUNT; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; Loading Loading @@ -57,6 +56,7 @@ import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.entities.api.MastodonList; import app.fedilab.android.client.entities.app.BottomMenu; import app.fedilab.android.client.entities.app.Pinned; Loading Loading @@ -94,59 +94,6 @@ public class PinnedTimelineHelper { } /** * Returns the slug of the first loaded fragment * * @param context - Context * @param pinned - {@link Pinned} * @param bottomMenu - {@link BottomMenu} * @return String - slug */ public static String firstTimelineSlug(Context context, Pinned pinned, BottomMenu bottomMenu) { String slug = Timeline.TimeLineEnum.HOME.getValue(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean singleBar = sharedpreferences.getBoolean(context.getString(R.string.SET_USE_SINGLE_TOPBAR), false); PinnedTimeline pinnedTimelineMin = null; if (singleBar) { if (pinned != null && pinned.pinnedTimelines != null) { for (PinnedTimeline pinnedTimeline : pinned.pinnedTimelines) { if (pinnedTimeline.displayed) { if (pinnedTimelineMin == null) { pinnedTimelineMin = pinnedTimeline; } else if (pinnedTimelineMin.position > pinnedTimeline.position) { pinnedTimelineMin = pinnedTimeline; } } } } } else { if (bottomMenu != null && bottomMenu.bottom_menu != null && bottomMenu.bottom_menu.size() > 0) { BottomMenu.MenuItem menuItem = bottomMenu.bottom_menu.get(0); return menuItem.item_menu_type.getValue(); } } String ident = null; if (pinnedTimelineMin != null) { if (pinnedTimelineMin.tagTimeline != null) { ident = "@T@" + pinnedTimelineMin.tagTimeline.name; if (pinnedTimelineMin.tagTimeline.isART) { pinnedTimelineMin.type = Timeline.TimeLineEnum.ART; } } else if (pinnedTimelineMin.mastodonList != null) { ident = "@l@" + pinnedTimelineMin.mastodonList.id; } else if (pinnedTimelineMin.remoteInstance != null) { if (pinnedTimelineMin.remoteInstance.type == RemoteInstance.InstanceType.NITTER) { String remoteInstance = sharedpreferences.getString(context.getString(R.string.SET_NITTER_HOST), context.getString(R.string.DEFAULT_NITTER_HOST)).toLowerCase(); ident = "@R@" + remoteInstance; } else { ident = "@R@" + pinnedTimelineMin.remoteInstance.host; } } slug = pinnedTimelineMin.type.getValue() + (ident != null ? "|" + ident : ""); } return slug; } public synchronized static void redrawTopBarPinned(BaseMainActivity activity, ActivityMainBinding activityMainBinding, Pinned pinned, BottomMenu bottomMenu, List<MastodonList> mastodonLists) { //Values must be initialized if there is no records in db Loading @@ -159,8 +106,8 @@ public class PinnedTimelineHelper { pinned.pinnedTimelines = new ArrayList<>(); } //Set the slug of first visible fragment String slugOfFirstFragment = PinnedTimelineHelper.firstTimelineSlug(activity, pinned, bottomMenu); Helper.setSlugOfFirstFragment(activity, slugOfFirstFragment, currentUserID, currentInstance); /*String slugOfFirstFragment = PinnedTimelineHelper.firstTimelineSlug(activity, pinned, bottomMenu); Helper.setSlugOfFirstFragment(activity, slugOfFirstFragment, currentUserID, currentInstance);*/ SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); boolean singleBar = sharedpreferences.getBoolean(activity.getString(R.string.SET_USE_SINGLE_TOPBAR), false); Loading @@ -187,6 +134,7 @@ public class PinnedTimelineHelper { activityMainBinding.viewPager.setLayoutParams(params); List<PinnedTimeline> pinnedTimelines = pinned.pinnedTimelines; boolean extraFeatures = sharedpreferences.getBoolean(activity.getString(R.string.SET_EXTAND_EXTRA_FEATURES) + MainActivity.currentUserID + MainActivity.currentInstance, false); if (singleBar) { boolean createDefaultAtTop = true; Loading Loading @@ -222,15 +170,40 @@ public class PinnedTimelineHelper { pinnedTimelineConversations.type = Timeline.TimeLineEnum.DIRECT; pinnedTimelineConversations.position = 4; pinned.pinnedTimelines.add(pinnedTimelineConversations); try { new Pinned(activity).updatePinned(pinned); } catch (DBException e) { e.printStackTrace(); } } } if (extraFeatures) { try { Pinned pinnedAll = new Pinned(activity).getAllPinned(currentAccount); boolean createDefaultBubbleAtTop = true; for (PinnedTimeline pinnedTimeline : pinnedAll.pinnedTimelines) { if (pinnedTimeline.type == Timeline.TimeLineEnum.BUBBLE) { createDefaultBubbleAtTop = false; break; } } if (createDefaultBubbleAtTop) { PinnedTimeline pinnedTimelineBubble = new PinnedTimeline(); pinnedTimelineBubble.type = Timeline.TimeLineEnum.BUBBLE; pinnedTimelineBubble.position = pinnedAll.pinnedTimelines != null ? pinnedAll.pinnedTimelines.size() : 0; pinned.pinnedTimelines.add(pinnedTimelineBubble); boolean exist = new Pinned(activity).pinnedExist(pinned); if (exist) { new Pinned(activity).updatePinned(pinned); } else { new Pinned(activity).insertPinned(pinned); } } } catch (DBException e) { e.printStackTrace(); } } sortPositionAsc(pinnedTimelines); //Check if changes occurred, if mastodonLists is null it does need, because it is the first call to draw pinned boolean needRedraw = mastodonLists == null; Loading Loading @@ -421,6 +394,9 @@ public class PinnedTimelineHelper { case DIRECT: tabCustomDefaultViewBinding.icon.setImageResource(R.drawable.ic_baseline_mail_24); break; case BUBBLE: tabCustomDefaultViewBinding.icon.setImageResource(R.drawable.ic_baseline_bubble_chart_24); break; } tab.setCustomView(tabCustomDefaultViewBinding.getRoot()); } Loading app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,10 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol holder.binding.icon.setImageResource(R.drawable.ic_baseline_mail_24); holder.binding.text.setText(R.string.v_direct); break; case BUBBLE: holder.binding.icon.setImageResource(R.drawable.ic_baseline_bubble_chart_24); holder.binding.text.setText(R.string.bubble); break; } Loading app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +8 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package app.fedilab.android.ui.fragment.timeline; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.currentUserID; import static app.fedilab.android.BaseMainActivity.networkAvailable; import android.content.BroadcastReceiver; Loading Loading @@ -342,6 +341,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. minified = getArguments().getBoolean(Helper.ARG_MINIFIED, false); statusReport = (Status) getArguments().getSerializable(Helper.ARG_STATUS_REPORT); } //When visiting a profile without being authenticated if (checkRemotely) { String[] acctArray = accountTimeline.acct.split("@"); Loading Loading @@ -619,7 +619,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. } }); //For first tab we fetch new messages, if we keep position if (slug != null && slug.compareTo(Helper.getSlugOfFirstFragment(requireActivity(), currentUserID, currentInstance)) == 0 && rememberPosition) { if (slug != null /*&& slug.compareTo(Helper.getSlugOfFirstFragment(requireActivity(), currentUserID, currentInstance)) == 0*/ && rememberPosition) { route(DIRECTION.FETCH_NEW, true); } } Loading Loading @@ -712,6 +712,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. timelineParams.local = false; timelineParams.remote = true; break; case BUBBLE: timelineParams.onlyMedia = false; timelineParams.remote = false; break; case LIST: timelineParams.listId = list_id; break; Loading Loading @@ -898,6 +902,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.PUBLIC) { //PUBLIC TIMELINE routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.BUBBLE) { //BUBBLE TIMELINE routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.REMOTE) { //REMOTE TIMELINE //NITTER TIMELINES if (pinnedTimeline != null && pinnedTimeline.remoteInstance.type == RemoteInstance.InstanceType.NITTER) { Loading Loading
app/src/main/java/app/fedilab/android/client/endpoints/MastodonTimelinesService.java +13 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,19 @@ public interface MastodonTimelinesService { @Query("limit") Integer limit ); @GET("timelines/bubble") Call<List<Status>> getBubble( @Header("Authorization") String token, @Query("only_media") Boolean only_media, @Query("remote") Boolean remote, @Query("with_muted") Boolean with_muted, @Query("exclude_visibilities") List<String> exclude_visibilities, @Query("reply_visibility") String reply_visibility, @Query("max_id") String max_id, @Query("since_id") String since_id, @Query("min_id") String min_id, @Query("limit") Integer limit ); @GET("trends/statuses") Call<List<Status>> getStatusTrends( Loading
app/src/main/java/app/fedilab/android/client/entities/app/Timeline.java +2 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,8 @@ public class Timeline { LOCAL("LOCAL"), @SerializedName("PUBLIC") PUBLIC("PUBLIC"), @SerializedName("BUBBLE") BUBBLE("BUBBLE"), @SerializedName("CONTEXT") CONTEXT("CONTEXT"), @SerializedName("TAG") Loading
app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +34 −58 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static app.fedilab.android.BaseMainActivity.show_replies; import static app.fedilab.android.ui.pageadapter.FedilabPageAdapter.BOTTOM_TIMELINE_COUNT; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; Loading Loading @@ -57,6 +56,7 @@ import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.entities.api.MastodonList; import app.fedilab.android.client.entities.app.BottomMenu; import app.fedilab.android.client.entities.app.Pinned; Loading Loading @@ -94,59 +94,6 @@ public class PinnedTimelineHelper { } /** * Returns the slug of the first loaded fragment * * @param context - Context * @param pinned - {@link Pinned} * @param bottomMenu - {@link BottomMenu} * @return String - slug */ public static String firstTimelineSlug(Context context, Pinned pinned, BottomMenu bottomMenu) { String slug = Timeline.TimeLineEnum.HOME.getValue(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean singleBar = sharedpreferences.getBoolean(context.getString(R.string.SET_USE_SINGLE_TOPBAR), false); PinnedTimeline pinnedTimelineMin = null; if (singleBar) { if (pinned != null && pinned.pinnedTimelines != null) { for (PinnedTimeline pinnedTimeline : pinned.pinnedTimelines) { if (pinnedTimeline.displayed) { if (pinnedTimelineMin == null) { pinnedTimelineMin = pinnedTimeline; } else if (pinnedTimelineMin.position > pinnedTimeline.position) { pinnedTimelineMin = pinnedTimeline; } } } } } else { if (bottomMenu != null && bottomMenu.bottom_menu != null && bottomMenu.bottom_menu.size() > 0) { BottomMenu.MenuItem menuItem = bottomMenu.bottom_menu.get(0); return menuItem.item_menu_type.getValue(); } } String ident = null; if (pinnedTimelineMin != null) { if (pinnedTimelineMin.tagTimeline != null) { ident = "@T@" + pinnedTimelineMin.tagTimeline.name; if (pinnedTimelineMin.tagTimeline.isART) { pinnedTimelineMin.type = Timeline.TimeLineEnum.ART; } } else if (pinnedTimelineMin.mastodonList != null) { ident = "@l@" + pinnedTimelineMin.mastodonList.id; } else if (pinnedTimelineMin.remoteInstance != null) { if (pinnedTimelineMin.remoteInstance.type == RemoteInstance.InstanceType.NITTER) { String remoteInstance = sharedpreferences.getString(context.getString(R.string.SET_NITTER_HOST), context.getString(R.string.DEFAULT_NITTER_HOST)).toLowerCase(); ident = "@R@" + remoteInstance; } else { ident = "@R@" + pinnedTimelineMin.remoteInstance.host; } } slug = pinnedTimelineMin.type.getValue() + (ident != null ? "|" + ident : ""); } return slug; } public synchronized static void redrawTopBarPinned(BaseMainActivity activity, ActivityMainBinding activityMainBinding, Pinned pinned, BottomMenu bottomMenu, List<MastodonList> mastodonLists) { //Values must be initialized if there is no records in db Loading @@ -159,8 +106,8 @@ public class PinnedTimelineHelper { pinned.pinnedTimelines = new ArrayList<>(); } //Set the slug of first visible fragment String slugOfFirstFragment = PinnedTimelineHelper.firstTimelineSlug(activity, pinned, bottomMenu); Helper.setSlugOfFirstFragment(activity, slugOfFirstFragment, currentUserID, currentInstance); /*String slugOfFirstFragment = PinnedTimelineHelper.firstTimelineSlug(activity, pinned, bottomMenu); Helper.setSlugOfFirstFragment(activity, slugOfFirstFragment, currentUserID, currentInstance);*/ SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); boolean singleBar = sharedpreferences.getBoolean(activity.getString(R.string.SET_USE_SINGLE_TOPBAR), false); Loading @@ -187,6 +134,7 @@ public class PinnedTimelineHelper { activityMainBinding.viewPager.setLayoutParams(params); List<PinnedTimeline> pinnedTimelines = pinned.pinnedTimelines; boolean extraFeatures = sharedpreferences.getBoolean(activity.getString(R.string.SET_EXTAND_EXTRA_FEATURES) + MainActivity.currentUserID + MainActivity.currentInstance, false); if (singleBar) { boolean createDefaultAtTop = true; Loading Loading @@ -222,15 +170,40 @@ public class PinnedTimelineHelper { pinnedTimelineConversations.type = Timeline.TimeLineEnum.DIRECT; pinnedTimelineConversations.position = 4; pinned.pinnedTimelines.add(pinnedTimelineConversations); try { new Pinned(activity).updatePinned(pinned); } catch (DBException e) { e.printStackTrace(); } } } if (extraFeatures) { try { Pinned pinnedAll = new Pinned(activity).getAllPinned(currentAccount); boolean createDefaultBubbleAtTop = true; for (PinnedTimeline pinnedTimeline : pinnedAll.pinnedTimelines) { if (pinnedTimeline.type == Timeline.TimeLineEnum.BUBBLE) { createDefaultBubbleAtTop = false; break; } } if (createDefaultBubbleAtTop) { PinnedTimeline pinnedTimelineBubble = new PinnedTimeline(); pinnedTimelineBubble.type = Timeline.TimeLineEnum.BUBBLE; pinnedTimelineBubble.position = pinnedAll.pinnedTimelines != null ? pinnedAll.pinnedTimelines.size() : 0; pinned.pinnedTimelines.add(pinnedTimelineBubble); boolean exist = new Pinned(activity).pinnedExist(pinned); if (exist) { new Pinned(activity).updatePinned(pinned); } else { new Pinned(activity).insertPinned(pinned); } } } catch (DBException e) { e.printStackTrace(); } } sortPositionAsc(pinnedTimelines); //Check if changes occurred, if mastodonLists is null it does need, because it is the first call to draw pinned boolean needRedraw = mastodonLists == null; Loading Loading @@ -421,6 +394,9 @@ public class PinnedTimelineHelper { case DIRECT: tabCustomDefaultViewBinding.icon.setImageResource(R.drawable.ic_baseline_mail_24); break; case BUBBLE: tabCustomDefaultViewBinding.icon.setImageResource(R.drawable.ic_baseline_bubble_chart_24); break; } tab.setCustomView(tabCustomDefaultViewBinding.getRoot()); } Loading
app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java +4 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,10 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol holder.binding.icon.setImageResource(R.drawable.ic_baseline_mail_24); holder.binding.text.setText(R.string.v_direct); break; case BUBBLE: holder.binding.icon.setImageResource(R.drawable.ic_baseline_bubble_chart_24); holder.binding.text.setText(R.string.bubble); break; } Loading
app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +8 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package app.fedilab.android.ui.fragment.timeline; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.currentUserID; import static app.fedilab.android.BaseMainActivity.networkAvailable; import android.content.BroadcastReceiver; Loading Loading @@ -342,6 +341,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. minified = getArguments().getBoolean(Helper.ARG_MINIFIED, false); statusReport = (Status) getArguments().getSerializable(Helper.ARG_STATUS_REPORT); } //When visiting a profile without being authenticated if (checkRemotely) { String[] acctArray = accountTimeline.acct.split("@"); Loading Loading @@ -619,7 +619,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. } }); //For first tab we fetch new messages, if we keep position if (slug != null && slug.compareTo(Helper.getSlugOfFirstFragment(requireActivity(), currentUserID, currentInstance)) == 0 && rememberPosition) { if (slug != null /*&& slug.compareTo(Helper.getSlugOfFirstFragment(requireActivity(), currentUserID, currentInstance)) == 0*/ && rememberPosition) { route(DIRECTION.FETCH_NEW, true); } } Loading Loading @@ -712,6 +712,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. timelineParams.local = false; timelineParams.remote = true; break; case BUBBLE: timelineParams.onlyMedia = false; timelineParams.remote = false; break; case LIST: timelineParams.listId = list_id; break; Loading Loading @@ -898,6 +902,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.PUBLIC) { //PUBLIC TIMELINE routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.BUBBLE) { //BUBBLE TIMELINE routeCommon(direction, fetchingMissing, statusToUpdate); } else if (timelineType == Timeline.TimeLineEnum.REMOTE) { //REMOTE TIMELINE //NITTER TIMELINES if (pinnedTimeline != null && pinnedTimeline.remoteInstance.type == RemoteInstance.InstanceType.NITTER) { Loading