diff options
Diffstat (limited to 'app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java')
-rw-r--r-- | app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java | 344 |
1 files changed, 285 insertions, 59 deletions
diff --git a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java index e39da3142..f95e42c38 100644 --- a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java @@ -14,6 +14,7 @@ package app.fedilab.android.helper; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ + import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.currentUserID; @@ -22,7 +23,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; @@ -57,8 +57,10 @@ 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.BubbleTimeline; import app.fedilab.android.client.entities.app.Pinned; import app.fedilab.android.client.entities.app.PinnedTimeline; import app.fedilab.android.client.entities.app.RemoteInstance; @@ -66,6 +68,8 @@ import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.client.entities.app.TagTimeline; import app.fedilab.android.client.entities.app.Timeline; import app.fedilab.android.databinding.ActivityMainBinding; +import app.fedilab.android.databinding.DialogBubbleExcludeVisibilityBinding; +import app.fedilab.android.databinding.DialogBubbleReplyVisibilityBinding; import app.fedilab.android.databinding.TabCustomDefaultViewBinding; import app.fedilab.android.databinding.TabCustomViewBinding; import app.fedilab.android.exception.DBException; @@ -94,60 +98,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 if (pinned == null) { @@ -159,8 +109,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); @@ -187,6 +137,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; @@ -222,15 +173,46 @@ 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); + if (pinnedAll == null) { + pinnedAll = new Pinned(); + pinnedAll.user_id = currentUserID; + pinnedAll.instance = currentInstance; + pinnedAll.pinnedTimelines = new ArrayList<>(); + } + 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; @@ -421,6 +403,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()); } @@ -522,6 +507,9 @@ public class PinnedTimelineHelper { case TAG: tagClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); break; + case BUBBLE: + bubbleClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); + break; case REMOTE: if (pinnedTimelineVisibleList.get(position).remoteInstance.type != RemoteInstance.InstanceType.NITTER) { instanceClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString()); @@ -1005,6 +993,244 @@ public class PinnedTimelineHelper { /** + * Manage long clicks on Bubble timelines + * + * @param activity - BaseMainActivity activity + * @param pinned - {@link Pinned} + * @param view - View + * @param position - int position of the tab + */ + public static void bubbleClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position, String slug) { + int toRemove = itemToRemoveInBottomMenu(activity); + PopupMenu popup = new PopupMenu(activity, view); + int offSetPosition = position - (BOTTOM_TIMELINE_COUNT - toRemove); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); + boolean singleBar = sharedpreferences.getBoolean(activity.getString(R.string.SET_USE_SINGLE_TOPBAR), false); + if (singleBar) { + offSetPosition = position; + } + + if (pinned.pinnedTimelines.get(offSetPosition).bubbleTimeline == null) { + pinned.pinnedTimelines.get(offSetPosition).bubbleTimeline = new BubbleTimeline(); + } + BubbleTimeline bubbleTimeline = pinned.pinnedTimelines.get(offSetPosition).bubbleTimeline; + + popup.getMenuInflater() + .inflate(R.menu.option_bubble_timeline, popup.getMenu()); + Menu menu = popup.getMenu(); + + final MenuItem itemMediaOnly = menu.findItem(R.id.action_show_media_only); + final MenuItem itemRemote = menu.findItem(R.id.action_remote); + + + final boolean[] changes = {false}; + final boolean[] mediaOnly = {false}; + final boolean[] remote = {false}; + mediaOnly[0] = bubbleTimeline.only_media; + remote[0] = bubbleTimeline.remote; + itemMediaOnly.setChecked(mediaOnly[0]); + itemRemote.setChecked(remote[0]); + popup.setOnDismissListener(menu1 -> { + if (changes[0]) { + if (activityMainBinding.viewPager.getAdapter() != null) { + try { + new StatusCache(activity).deleteForSlug(slug); + } catch (DBException e) { + e.printStackTrace(); + } + + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(activity.getString(R.string.SET_INNER_MARKER) + BaseMainActivity.currentUserID + BaseMainActivity.currentInstance + slug, null); + editor.commit(); + Fragment fragmentMastodonTimeline = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition()); + if (fragmentMastodonTimeline instanceof FragmentMastodonTimeline && fragmentMastodonTimeline.isVisible()) { + FragmentTransaction fragTransaction = activity.getSupportFragmentManager().beginTransaction(); + fragTransaction.detach(fragmentMastodonTimeline).commit(); + Bundle bundle = new Bundle(); + bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.BUBBLE); + bundle.putSerializable(Helper.ARG_BUBBLE_TIMELINE, bubbleTimeline); + bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false); + fragmentMastodonTimeline.setArguments(bundle); + FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction(); + fragTransaction2.attach(fragmentMastodonTimeline); + fragTransaction2.commit(); + ((FragmentMastodonTimeline) fragmentMastodonTimeline).recreate(); + } + } + } + }); + + + int finalOffSetPosition = offSetPosition; + popup.setOnMenuItemClickListener(item -> { + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); + item.setActionView(new View(activity)); + item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(MenuItem item) { + return false; + } + + @Override + public boolean onMenuItemActionCollapse(MenuItem item) { + return false; + } + }); + changes[0] = true; + int itemId = item.getItemId(); + if (itemId == R.id.action_show_media_only) { + mediaOnly[0] = !mediaOnly[0]; + bubbleTimeline.only_media = mediaOnly[0]; + pinned.pinnedTimelines.get(finalOffSetPosition).bubbleTimeline = bubbleTimeline; + itemMediaOnly.setChecked(mediaOnly[0]); + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + } else if (itemId == R.id.action_remote) { + remote[0] = !remote[0]; + bubbleTimeline.remote = remote[0]; + pinned.pinnedTimelines.get(finalOffSetPosition).bubbleTimeline = bubbleTimeline; + itemRemote.setChecked(remote[0]); + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + } else if (itemId == R.id.action_exclude_visibility) { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, Helper.dialogStyle()); + DialogBubbleExcludeVisibilityBinding dialogBinding = DialogBubbleExcludeVisibilityBinding.inflate(activity.getLayoutInflater()); + dialogBuilder.setView(dialogBinding.getRoot()); + dialogBuilder.setTitle(R.string.exclude_visibility); + if (bubbleTimeline.exclude_visibilities == null) { + bubbleTimeline.exclude_visibilities = new ArrayList<>(); + } + for (String value : bubbleTimeline.exclude_visibilities) { + if (value.equalsIgnoreCase("public")) { + dialogBinding.valuePublic.setChecked(true); + } + if (value.equalsIgnoreCase("local")) { + dialogBinding.valueLocal.setChecked(true); + } + if (value.equalsIgnoreCase("direct")) { + dialogBinding.valueDirect.setChecked(true); + } + if (value.equalsIgnoreCase("list")) { + dialogBinding.valueList.setChecked(true); + } + if (value.equalsIgnoreCase("private")) { + dialogBinding.valuePrivate.setChecked(true); + } + if (value.equalsIgnoreCase("unlisted")) { + dialogBinding.valueUnlisted.setChecked(true); + } + } + dialogBinding.valuePrivate.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("private")) { + bubbleTimeline.exclude_visibilities.add("private"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("private"); + } + }); + dialogBinding.valueDirect.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("direct")) { + bubbleTimeline.exclude_visibilities.add("direct"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("direct"); + } + }); + dialogBinding.valueList.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("list")) { + bubbleTimeline.exclude_visibilities.add("list"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("list"); + } + }); + dialogBinding.valueLocal.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("local")) { + bubbleTimeline.exclude_visibilities.add("local"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("local"); + } + }); + dialogBinding.valuePublic.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("public")) { + bubbleTimeline.exclude_visibilities.add("public"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("public"); + } + }); + dialogBinding.valueUnlisted.setOnCheckedChangeListener((compoundButton, checked) -> { + if (checked) { + if (!bubbleTimeline.exclude_visibilities.contains("unlisted")) { + bubbleTimeline.exclude_visibilities.add("unlisted"); + } + } else { + bubbleTimeline.exclude_visibilities.remove("unlisted"); + } + }); + dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { + pinned.pinnedTimelines.get(finalOffSetPosition).bubbleTimeline = bubbleTimeline; + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.show(); + } else if (itemId == R.id.action_reply_visibility) { + AlertDialog.Builder dialogBuilder; + AlertDialog alertDialog; + dialogBuilder = new AlertDialog.Builder(activity, Helper.dialogStyle()); + DialogBubbleReplyVisibilityBinding dialogBinding = DialogBubbleReplyVisibilityBinding.inflate(activity.getLayoutInflater()); + dialogBuilder.setView(dialogBinding.getRoot()); + dialogBuilder.setTitle(R.string.reply_visibility); + int checkedId = R.id.all; + if (bubbleTimeline.reply_visibility != null && bubbleTimeline.reply_visibility.equalsIgnoreCase("following")) { + checkedId = R.id.following; + } else if (bubbleTimeline.reply_visibility != null && bubbleTimeline.reply_visibility.equalsIgnoreCase("self")) { + checkedId = R.id.self; + } + dialogBinding.replyVisibility.check(checkedId); + dialogBinding.replyVisibility.setOnCheckedChangeListener((radioGroup, checkedElement) -> { + if (checkedElement == R.id.all) { + bubbleTimeline.reply_visibility = null; + } else if (checkedElement == R.id.following) { + bubbleTimeline.reply_visibility = "following"; + } else if (checkedElement == R.id.self) { + bubbleTimeline.reply_visibility = "self"; + } + }); + dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { + pinned.pinnedTimelines.get(finalOffSetPosition).bubbleTimeline = bubbleTimeline; + try { + new Pinned(activity).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + }); + alertDialog = dialogBuilder.create(); + alertDialog.show(); + } + return false; + }); + popup.show(); + } + + + /** * Manage long clicks on followed instances * * @param activity - BaseMainActivity activity |