Fix an issue with media timelines

This commit is contained in:
Thomas 2022-10-28 17:19:24 +02:00
parent 3dbfe33983
commit a81879fb36
5 changed files with 70 additions and 15 deletions

View File

@ -429,6 +429,27 @@ public class StatusCache {
}
}
/**
* delete all cache for an slug
*
* @return long - db id
* @throws DBException exception with database
*/
public long deleteForSlug(String slug) throws DBException {
if (db == null) {
throw new DBException("db is null. Wrong initialization.");
}
try {
return db.delete(Sqlite.TABLE_STATUS_CACHE,
Sqlite.COL_SLUG + " = ? AND " + Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
new String[]{slug, MainActivity.currentUserID, MainActivity.currentInstance});
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* delete all cache for an account
*
@ -581,7 +602,6 @@ public class StatusCache {
selection += "AND " + Sqlite.COL_STATUS_ID + " > '" + since_id + "' ";
limit = null;
}
try {
Cursor c = db.query(Sqlite.TABLE_STATUS_CACHE, null, selection, null, Sqlite.COL_STATUS_ID, null, Sqlite.COL_STATUS_ID + order, limit);
return createStatusReply(cursorToListOfStatuses(c));

View File

@ -27,7 +27,6 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@ -63,6 +62,7 @@ import app.fedilab.android.client.entities.app.BottomMenu;
import app.fedilab.android.client.entities.app.Pinned;
import app.fedilab.android.client.entities.app.PinnedTimeline;
import app.fedilab.android.client.entities.app.RemoteInstance;
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;
@ -491,19 +491,18 @@ public class PinnedTimelineHelper {
tabStrip.getChildAt(i).setOnLongClickListener(v -> {
int position = finalI - (BOTTOM_TIMELINE_COUNT - finalToRemove);
Log.v(Helper.TAG, "position: " + position + " -> " + pinnedTimelineVisibleList.get(position).type);
switch (pinnedTimelineVisibleList.get(position).type) {
case LIST:
break;
case TAG:
tagClick(activity, finalPinned, v, activityMainBinding, finalI);
tagClick(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);
instanceClick(activity, finalPinned, v, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString());
} else {
nitterClick(activity, finalPinned, activityMainBinding, finalI);
nitterClick(activity, finalPinned, activityMainBinding, finalI, activityMainBinding.tabLayout.getTabAt(finalI).getTag().toString());
}
break;
case HOME:
@ -758,7 +757,7 @@ public class PinnedTimelineHelper {
* @param view - View
* @param position - int position of the tab
*/
public static void tagClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position) {
public static void tagClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position, String slug) {
int toRemove = itemToRemoveInBottomMenu(activity);
PopupMenu popup = new PopupMenu(new ContextThemeWrapper(activity, Helper.popupStyle()), view);
int offSetPosition = position - (BOTTOM_TIMELINE_COUNT - toRemove);
@ -769,7 +768,6 @@ public class PinnedTimelineHelper {
}
String tag;
TagTimeline tagTimeline = pinned.pinnedTimelines.get(offSetPosition).tagTimeline;
Log.v(Helper.TAG, "tagTimeline: " + tagTimeline);
if (tagTimeline == null)
return;
if (tagTimeline.displayName != null)
@ -795,6 +793,14 @@ public class PinnedTimelineHelper {
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();
@ -802,6 +808,7 @@ public class PinnedTimelineHelper {
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.TAG);
bundle.putSerializable(Helper.ARG_TAG_TIMELINE, tagTimeline);
bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false);
fragmentMastodonTimeline.setArguments(bundle);
FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction();
fragTransaction2.attach(fragmentMastodonTimeline);
@ -975,7 +982,7 @@ public class PinnedTimelineHelper {
* @param view - View
* @param position - int position of the tab
*/
public static void instanceClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position) {
public static void instanceClick(BaseMainActivity activity, Pinned pinned, View view, ActivityMainBinding activityMainBinding, int position, String slug) {
PopupMenu popup = new PopupMenu(new ContextThemeWrapper(activity, Helper.popupStyle()), view);
int toRemove = itemToRemoveInBottomMenu(activity);
@ -986,6 +993,7 @@ public class PinnedTimelineHelper {
offSetPosition = position;
}
RemoteInstance remoteInstance = pinned.pinnedTimelines.get(offSetPosition).remoteInstance;
if (remoteInstance == null)
return;
final String[] currentFilter = {remoteInstance.filteredWith};
@ -1016,6 +1024,11 @@ public class PinnedTimelineHelper {
});
changes[0] = true;
FragmentMastodonTimeline fragmentMastodonTimeline = null;
try {
new StatusCache(activity).deleteForSlug(slug);
} catch (DBException e) {
e.printStackTrace();
}
if (activityMainBinding.viewPager.getAdapter() != null) {
Fragment fragment = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition());
if (fragment instanceof FragmentMastodonTimeline && fragment.isVisible()) {
@ -1039,6 +1052,7 @@ public class PinnedTimelineHelper {
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition));
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE);
bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false);
fragmentMastodonTimeline.setArguments(bundle);
FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction();
fragTransaction2.attach(fragmentMastodonTimeline);
@ -1069,6 +1083,11 @@ public class PinnedTimelineHelper {
fragmentMastodonTimeline.refreshAllAdapters();
}
}
try {
new StatusCache(activity).deleteForSlug(slug);
} catch (DBException e) {
e.printStackTrace();
}
FragmentTransaction fragTransaction1 = activity.getSupportFragmentManager().beginTransaction();
if (fragmentMastodonTimeline == null)
return false;
@ -1084,6 +1103,7 @@ public class PinnedTimelineHelper {
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition1));
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE);
bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false);
fragmentMastodonTimeline.setArguments(bundle);
FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction();
fragTransaction2.attach(fragmentMastodonTimeline);
@ -1132,7 +1152,7 @@ public class PinnedTimelineHelper {
}
popup.getMenu().clear();
popup.getMenu().close();
instanceClick(activity, pinned, view, activityMainBinding, position);
instanceClick(activity, pinned, view, activityMainBinding, position, slug);
});
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();
@ -1143,6 +1163,11 @@ public class PinnedTimelineHelper {
popup.setOnDismissListener(menu -> {
if (changes[0]) {
FragmentMastodonTimeline fragmentMastodonTimeline = null;
try {
new StatusCache(activity).deleteForSlug(slug);
} catch (DBException e) {
e.printStackTrace();
}
if (activityMainBinding.viewPager.getAdapter() != null) {
Fragment fragment = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition());
if (fragment instanceof FragmentMastodonTimeline && fragment.isVisible()) {
@ -1157,6 +1182,7 @@ public class PinnedTimelineHelper {
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition2));
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE);
bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false);
fragmentMastodonTimeline.setArguments(bundle);
FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction();
fragTransaction2.attach(fragmentMastodonTimeline);
@ -1174,7 +1200,7 @@ public class PinnedTimelineHelper {
* @param pinned - {@link Pinned}
* @param position - int position of the tab
*/
public static void nitterClick(BaseMainActivity activity, Pinned pinned, ActivityMainBinding activityMainBinding, int position) {
public static void nitterClick(BaseMainActivity activity, Pinned pinned, ActivityMainBinding activityMainBinding, int position, String slug) {
int toRemove = itemToRemoveInBottomMenu(activity);
int offSetPosition = position - (BOTTOM_TIMELINE_COUNT - toRemove);
@ -1206,6 +1232,11 @@ public class PinnedTimelineHelper {
e.printStackTrace();
}
FragmentMastodonTimeline fragmentMastodonTimeline = null;
try {
new StatusCache(activity).deleteForSlug(slug);
} catch (DBException e) {
e.printStackTrace();
}
if (activityMainBinding.viewPager.getAdapter() != null) {
Fragment fragment = (Fragment) activityMainBinding.viewPager.getAdapter().instantiateItem(activityMainBinding.viewPager, activityMainBinding.tabLayout.getSelectedTabPosition());
if (fragment instanceof FragmentMastodonTimeline && fragment.isVisible()) {
@ -1220,6 +1251,7 @@ public class PinnedTimelineHelper {
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_REMOTE_INSTANCE, pinned.pinnedTimelines.get(finalOffSetPosition));
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.REMOTE);
bundle.putSerializable(Helper.ARG_INITIALIZE_VIEW, false);
fragmentMastodonTimeline.setArguments(bundle);
FragmentTransaction fragTransaction2 = activity.getSupportFragmentManager().beginTransaction();
fragTransaction2.attach(fragmentMastodonTimeline);

View File

@ -252,7 +252,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
ident = null;
}
if (timelineType != null) {
slug = timelineType.getValue() + (ident != null ? "|" + ident : "");
slug = timelineType != Timeline.TimeLineEnum.ART ? timelineType.getValue() + (ident != null ? "|" + ident : "") : Timeline.TimeLineEnum.TAG.getValue() + (ident != null ? "|" + ident : "");
}
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
@ -328,6 +328,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
flagLoading = fetched_statuses.pagination.max_id == null;
binding.noAction.setVisibility(View.GONE);
if (timelineType == Timeline.TimeLineEnum.ART) {
//We have to split media in different statuses
List<Status> mediaStatuses = new ArrayList<>();
@ -574,7 +575,6 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
timelineParams.maxId = max_id;
}
timelineParams.fetchingMissing = fetchingMissing;
switch (timelineType) {
case LOCAL:
timelineParams.local = true;
@ -587,6 +587,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
case LIST:
timelineParams.listId = list_id;
break;
case ART:
case TAG:
if (tagTimeline == null) {
tagTimeline = new TagTimeline();
@ -608,7 +609,6 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
boolean useCache = sharedpreferences.getBoolean(getString(R.string.SET_USE_CACHE), true);
Handler handler = new Handler();
handler.postDelayed(() -> {
if (useCache && direction != DIRECTION.SCROLL_TOP && direction != DIRECTION.FETCH_NEW) {
@ -681,10 +681,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (direction == null) {
timelinesVM.getTimelineCache(timelineStatuses, timelineParams)
.observe(getViewLifecycleOwner(), statusesCached -> {
initialStatuses = statusesCached;
if (statusesCached == null || statusesCached.statuses == null || statusesCached.statuses.size() == 0) {
getLiveStatus(null, fetchingMissing, timelineParams, null);
} else {
initialStatuses = statusesCached;
initializeStatusesCommonView(statusesCached);
}
});
@ -727,6 +727,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (getView() == null) {
return;
}
if (direction == null) {
timelinesVM.getTimeline(timelineStatuses, timelineParams)
.observe(getViewLifecycleOwner(), statuses -> {

View File

@ -402,6 +402,7 @@ public class TimelinesVM extends AndroidViewModel {
case PUBLIC:
timelineCall = mastodonTimelinesService.getPublic(timelineParams.token, false, true, timelineParams.onlyMedia, timelineParams.maxId, timelineParams.sinceId, timelineParams.minId, timelineParams.limit);
break;
case ART:
case TAG:
timelineCall = mastodonTimelinesService.getHashTag(timelineParams.token, timelineParams.hashtagTrim, timelineParams.local, timelineParams.onlyMedia, timelineParams.all, timelineParams.any, timelineParams.none, timelineParams.maxId, timelineParams.sinceId, timelineParams.minId, timelineParams.limit);
break;

View File

@ -328,6 +328,7 @@
android:padding="1dp"
android:adjustViewBounds="true"
android:visibility="gone"
android:scaleType="centerCrop"
tools:visibility="visible"
tools:src="@tools:sample/backgrounds/scenic" />