bug fix, code cleanup

This commit is contained in:
nuclearfog 2023-10-03 18:44:48 +02:00
parent 55b5648623
commit b728208f03
No known key found for this signature in database
GPG Key ID: 03488A185C476379
28 changed files with 232 additions and 108 deletions

View File

@ -27,10 +27,10 @@ import org.nuclearfog.twidda.model.UserList;
import org.nuclearfog.twidda.model.WebPush;
import org.nuclearfog.twidda.model.lists.Domains;
import org.nuclearfog.twidda.model.lists.Filters;
import org.nuclearfog.twidda.model.lists.Hashtags;
import org.nuclearfog.twidda.model.lists.Notifications;
import org.nuclearfog.twidda.model.lists.ScheduledStatuses;
import org.nuclearfog.twidda.model.lists.Statuses;
import org.nuclearfog.twidda.model.lists.Hashtags;
import org.nuclearfog.twidda.model.lists.UserLists;
import org.nuclearfog.twidda.model.lists.Users;

View File

@ -57,10 +57,10 @@ import org.nuclearfog.twidda.model.UserList;
import org.nuclearfog.twidda.model.WebPush;
import org.nuclearfog.twidda.model.lists.Domains;
import org.nuclearfog.twidda.model.lists.Filters;
import org.nuclearfog.twidda.model.lists.Hashtags;
import org.nuclearfog.twidda.model.lists.Notifications;
import org.nuclearfog.twidda.model.lists.ScheduledStatuses;
import org.nuclearfog.twidda.model.lists.Statuses;
import org.nuclearfog.twidda.model.lists.Hashtags;
import org.nuclearfog.twidda.model.lists.UserLists;
import org.nuclearfog.twidda.model.lists.Users;
@ -467,6 +467,9 @@ public class Mastodon implements Connection {
@Override
public Hashtags searchHashtags(String search) throws MastodonException {
List<String> params = new ArrayList<>();
if (search.startsWith("#"))
params.add("q=" + StringUtils.encode(search.substring(1)));
else
params.add("q=" + StringUtils.encode(search));
params.add("type=hashtags");
Hashtags result = getTrends(ENDPOINT_SEARCH_TIMELINE, params);

View File

@ -43,9 +43,9 @@ import org.nuclearfog.twidda.model.Poll;
import org.nuclearfog.twidda.model.Status;
import org.nuclearfog.twidda.model.User;
import org.nuclearfog.twidda.model.lists.Accounts;
import org.nuclearfog.twidda.model.lists.Hashtags;
import org.nuclearfog.twidda.model.lists.Notifications;
import org.nuclearfog.twidda.model.lists.Statuses;
import org.nuclearfog.twidda.model.lists.Hashtags;
import java.util.ArrayList;
import java.util.Collections;

View File

@ -175,6 +175,7 @@ public class ProfileActivity extends AppCompatActivity implements OnClickListene
confirmDialog = new ConfirmDialog(this, this);
picasso = PicassoBuilder.get(this);
settings = GlobalSettings.get(this);
adapter = new ProfileAdapter(this);
if (!settings.toolbarOverlapEnabled()) {
ConstraintSet constraints = new ConstraintSet();
@ -225,7 +226,7 @@ public class ProfileActivity extends AppCompatActivity implements OnClickListene
userId = user.getId();
}
// setup pager fragments
adapter = new ProfileAdapter(this, userId, settings.getLogin().getId() == userId);
adapter.setId(userId);
viewPager.setAdapter(adapter);
// set user/relation data and initialize loaders
if (user != null) {

View File

@ -7,6 +7,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentTransaction;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.utils.AppStyles;
import org.nuclearfog.twidda.ui.fragments.ScheduleFragment;

View File

@ -87,6 +87,7 @@ public class SearchActivity extends AppCompatActivity implements OnClickListener
settings = GlobalSettings.get(this);
hashtagAction = new HashtagAction(this);
adapter = new SearchAdapter(this);
String query = getIntent().getStringExtra(KEY_QUERY);
Serializable data = getIntent().getSerializableExtra(KEY_DATA);
@ -100,18 +101,16 @@ public class SearchActivity extends AppCompatActivity implements OnClickListener
hashtagAction.execute(param, this);
}
}
adapter.setSearch(search);
if (!settings.floatingButtonEnabled()) {
floatingButton.setVisibility(View.INVISIBLE);
}
toolbar.setTitle("");
setSupportActionBar(toolbar);
viewPager.setOffscreenPageLimit(3);
adapter = new SearchAdapter(this, search);
viewPager.setAdapter(adapter);
if (adapter.getItemCount() == 3)
tabSelector.addTabIcons(R.array.search_hashtag_tab_icons);
else
tabSelector.addTabIcons(R.array.search_tab_icons);
AppStyles.setTheme(root);
tabSelector.addOnTabSelectedListener(this);

View File

@ -112,25 +112,26 @@ public class UserlistActivity extends AppCompatActivity implements OnTabSelected
userlistDialog = new UserlistDialog(this, this);
listLoaderAsync = new UserlistAction(this);
listManagerAsync = new UserlistManager(this);
adapter = new UserlistAdapter(this);
Object data = getIntent().getSerializableExtra(KEY_DATA);
if (data instanceof UserList) {
userList = (UserList) data;
toolbar.setTitle(userList.getTitle());
adapter = new UserlistAdapter(this, userList.getId(), settings.getLogin().getConfiguration().isUserlistSubscriberSupported());
adapter.setId(userList.getId());
viewPager.setAdapter(adapter);
if (adapter.getItemCount() == 2) {
tabSelector.addTabIcons(R.array.list_tab_icons);
} else if (adapter.getItemCount() == 3) {
tabSelector.addTabIcons(R.array.list_subscriber_tab_icons);
}
}
viewPager.setOffscreenPageLimit(3);
setSupportActionBar(toolbar);
AppStyles.setTheme(root);
tabSelector.addOnTabSelectedListener(this);
}
}
@Override

View File

@ -58,18 +58,24 @@ public class UserlistsActivity extends AppCompatActivity implements UserlistUpda
TabSelector tabSelector = findViewById(R.id.page_tab_view_tabs);
viewPager = findViewById(R.id.page_tab_view_pager);
adapter = new UserListsAdapter(this);
userlistDialog = new UserlistDialog(this, this);
settings = GlobalSettings.get(this);
toolbar.setTitle(R.string.list_appbar);
setSupportActionBar(toolbar);
long ownerId = getIntent().getLongExtra(KEY_ID, 0L);
adapter.setId(ownerId);
if (settings.getLogin().getConfiguration().isUserlistMembershipSupported()) {
tabSelector.addTabIcons(R.array.userlist_tab_ownership_membership_icons);
adapter.setPageCount(2);
} else {
tabSelector.addTabIcons(R.array.userlist_tab_ownership_icons);
adapter.setPageCount(1);
}
adapter = new UserListsAdapter(this, ownerId, settings.getLogin().getConfiguration().isUserlistMembershipSupported());
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(2);
tabSelector.addTabIcons(R.array.userlist_tab_icons);
toolbar.setTitle(R.string.list_appbar);
setSupportActionBar(toolbar);
AppStyles.setOverflowIcon(toolbar, settings.getIconColor());
AppStyles.setTheme(root);

View File

@ -116,18 +116,21 @@ public class UsersActivity extends AppCompatActivity implements OnTabSelectedLis
filterLoader = new UserFilterAction(this);
settings = GlobalSettings.get(this);
adapter = new UserAdapter(this);
viewPager.setOffscreenPageLimit(3);
mode = getIntent().getIntExtra(KEY_MODE, 0);
long id = getIntent().getLongExtra(KEY_ID, 0L);
adapter.setId(id);
switch (mode) {
case USERS_FOLLOWING:
toolbar.setTitle(R.string.userlist_following);
adapter.setType(UserAdapter.FOLLOWING);
if (settings.getLogin().getId() == id)
adapter = new UserAdapter(this, id, UserAdapter.FOLLOWING, 2);
adapter.setPageCount(2);
else
adapter = new UserAdapter(this, id, UserAdapter.FOLLOWING, 1);
adapter.setPageCount(1);
viewPager.setAdapter(adapter);
if (adapter.getItemCount() > 1) {
tabSelector.addTabIcons(R.array.user_following);
@ -139,10 +142,11 @@ public class UsersActivity extends AppCompatActivity implements OnTabSelectedLis
case USERS_FOLLOWER:
toolbar.setTitle(R.string.userlist_follower);
adapter.setType(UserAdapter.FOLLOWER);
if (settings.getLogin().getId() == id && settings.getLogin().getConfiguration().isOutgoingFollowRequestSupported())
adapter = new UserAdapter(this, id, UserAdapter.FOLLOWER, 2);
adapter.setPageCount(2);
else
adapter = new UserAdapter(this, id, UserAdapter.FOLLOWER, 1);
adapter.setPageCount(1);
viewPager.setAdapter(adapter);
tabSelector.setVisibility(View.GONE);
if (adapter.getItemCount() > 1) {
@ -155,7 +159,8 @@ public class UsersActivity extends AppCompatActivity implements OnTabSelectedLis
case USERS_REPOST:
toolbar.setTitle(R.string.toolbar_userlist_repost);
adapter = new UserAdapter(this, id, UserAdapter.REPOSTER, 1);
adapter.setType(UserAdapter.REPOSTER);
adapter.setPageCount(1);
viewPager.setAdapter(adapter);
tabSelector.setVisibility(View.GONE);
break;
@ -163,14 +168,16 @@ public class UsersActivity extends AppCompatActivity implements OnTabSelectedLis
case USERS_FAVORIT:
int title = settings.likeEnabled() ? R.string.toolbar_status_liker : R.string.toolbar_status_favoriter;
toolbar.setTitle(title);
adapter = new UserAdapter(this, id, UserAdapter.FAVORITER, 1);
adapter.setType(UserAdapter.FAVORITER);
adapter.setPageCount(1);
viewPager.setAdapter(adapter);
tabSelector.setVisibility(View.GONE);
break;
case USERS_EXCLUDED:
toolbar.setTitle(R.string.menu_toolbar_excluded_users);
adapter = new UserAdapter(this, id, UserAdapter.BLOCKS, 3);
adapter.setType(UserAdapter.BLOCKS);
adapter.setPageCount(3);
viewPager.setAdapter(adapter);
tabSelector.addTabIcons(R.array.user_domain_exclude);
tabSelector.addOnTabSelectedListener(this);

View File

@ -16,13 +16,12 @@ import org.nuclearfog.twidda.ui.fragments.HashtagFragment;
*/
public class HashtagAdapter extends ViewPagerAdapter {
private static final int COUNT = 3;
/**
*
*/
public HashtagAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity, COUNT);
super(fragmentActivity);
setPageCount(3);
}

View File

@ -18,13 +18,12 @@ import org.nuclearfog.twidda.ui.fragments.StatusFragment;
*/
public class HomeAdapter extends ViewPagerAdapter {
private static final int SIZE = 4;
/**
*
*/
public HomeAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity, SIZE);
super(fragmentActivity);
setPageCount(4);
}

View File

@ -6,6 +6,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import org.nuclearfog.twidda.config.GlobalSettings;
import org.nuclearfog.twidda.ui.fragments.FieldFragment;
import org.nuclearfog.twidda.ui.fragments.ListFragment;
import org.nuclearfog.twidda.ui.fragments.StatusFragment;
@ -17,16 +18,16 @@ import org.nuclearfog.twidda.ui.fragments.StatusFragment;
*/
public class ProfileAdapter extends ViewPagerAdapter {
private long userId;
private boolean isCurrentUser;
private GlobalSettings settings;
private long userId = 0L;
/**
* @param userId ID of the user (profile ID)
*
*/
public ProfileAdapter(FragmentActivity fragmentActivity, long userId, boolean isCurrentUser) {
super(fragmentActivity, isCurrentUser ? 4 : 2);
this.isCurrentUser = isCurrentUser;
this.userId = userId;
public ProfileAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
settings = GlobalSettings.get(fragmentActivity);
}
@ -45,17 +46,17 @@ public class ProfileAdapter extends ViewPagerAdapter {
break;
case 1:
if (isCurrentUser) {
if (getItemCount() == 2) {
param = new Bundle();
param.putLong(FieldFragment.KEY_ID, userId);
fragment = new FieldFragment();
fragment.setArguments(param);
} else {
param = new Bundle();
param.putLong(StatusFragment.KEY_ID, userId);
param.putInt(StatusFragment.KEY_MODE, StatusFragment.MODE_FAVORIT);
fragment = new StatusFragment();
fragment.setArguments(param);
} else {
param = new Bundle();
param.putLong(FieldFragment.KEY_ID, userId);
fragment = new FieldFragment();
fragment.setArguments(param);
}
break;
@ -76,4 +77,18 @@ public class ProfileAdapter extends ViewPagerAdapter {
}
return fragment;
}
/**
* set user ID of the profile
*
* @param userId user ID
*/
public void setId(long userId) {
this.userId = userId;
if (settings.getLogin().getId() == userId) {
setPageCount(4);
} else {
setPageCount(2);
}
}
}

View File

@ -18,14 +18,14 @@ import org.nuclearfog.twidda.ui.fragments.UserFragment;
*/
public class SearchAdapter extends ViewPagerAdapter {
private String search;
private String search = "";
/**
* @param search search string
*
*/
public SearchAdapter(FragmentActivity fragmentActivity, String search) {
super(fragmentActivity, search.startsWith("#") ? 2 : 3);
this.search = search;
public SearchAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
setPageCount(3);
}
@ -61,4 +61,11 @@ public class SearchAdapter extends ViewPagerAdapter {
}
return fragment;
}
/**
* set search text used by fragments
*/
public void setSearch(String search) {
this.search = search;
}
}

View File

@ -43,16 +43,13 @@ public class UserAdapter extends ViewPagerAdapter {
public static final int BLOCKS = 14;
private long id;
private int mode;
private int type;
/**
* @param id Status ID, List ID or User ID, depending on mode
* @param mode what type of fragments should be loaded {@link #FOLLOWER,#FOLLOWING,#REQUESTS,#REPOSTER,#FAVORITER,#BLOCKS}
*
*/
public UserAdapter(FragmentActivity fragmentActivity, long id, int mode, int pages) {
super(fragmentActivity, pages);
this.mode = mode;
this.id = id;
public UserAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@ -65,15 +62,15 @@ public class UserAdapter extends ViewPagerAdapter {
case 0:
Bundle param = new Bundle();
param.putLong(UserFragment.KEY_ID, id);
if (mode == FOLLOWING) {
if (type == FOLLOWING) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_FOLLOWING);
} else if (mode == FOLLOWER) {
} else if (type == FOLLOWER) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_FOLLOWER);
} else if (mode == REPOSTER) {
} else if (type == REPOSTER) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_REPOSTER);
} else if (mode == FAVORITER) {
} else if (type == FAVORITER) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_FAVORITER);
} else if (mode == BLOCKS) {
} else if (type == BLOCKS) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_MUTES);
}
fragment = new UserFragment();
@ -82,11 +79,11 @@ public class UserAdapter extends ViewPagerAdapter {
case 1:
param = new Bundle();
if (mode == FOLLOWING) {
if (type == FOLLOWING) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_FOLLOW_INCOMING);
} else if (mode == FOLLOWER) {
} else if (type == FOLLOWER) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_FOLLOW_OUTGOING);
} else if (mode == BLOCKS) {
} else if (type == BLOCKS) {
param.putInt(UserFragment.KEY_MODE, UserFragment.MODE_BLOCKS);
}
fragment = new UserFragment();
@ -99,4 +96,20 @@ public class UserAdapter extends ViewPagerAdapter {
}
return fragment;
}
/**
* set content type to view
*
* @param type what type of fragments should be loaded {@link #FOLLOWER,#FOLLOWING,#REQUESTS,#REPOSTER,#FAVORITER,#BLOCKS}
*/
public void setType(int type) {
this.type = type;
}
/**
*
*/
public void setId(long id) {
this.id = id;
}
}

View File

@ -19,11 +19,10 @@ public class UserListsAdapter extends ViewPagerAdapter {
private long userId;
/**
* @param userId ID of the user related to the userlists
*
*/
public UserListsAdapter(FragmentActivity fragmentActivity, long userId, boolean enableMember) {
super(fragmentActivity, enableMember ? 2 : 1);
this.userId = userId;
public UserListsAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@ -51,4 +50,11 @@ public class UserListsAdapter extends ViewPagerAdapter {
}
return fragment;
}
/**
*
*/
public void setId(long userId) {
this.userId = userId;
}
}

View File

@ -6,6 +6,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import org.nuclearfog.twidda.config.GlobalSettings;
import org.nuclearfog.twidda.ui.fragments.ListFragment;
import org.nuclearfog.twidda.ui.fragments.StatusFragment;
import org.nuclearfog.twidda.ui.fragments.UserFragment;
@ -23,9 +24,14 @@ public class UserlistAdapter extends ViewPagerAdapter {
/**
*
*/
public UserlistAdapter(FragmentActivity fragmentActivity, long id, boolean enableSubscriber) {
super(fragmentActivity, enableSubscriber ? 3 : 2);
this.id = id;
public UserlistAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
GlobalSettings settings = GlobalSettings.get(fragmentActivity);
if (settings.getLogin().getConfiguration().isUserlistSubscriberSupported()) {
setPageCount(3);
} else {
setPageCount(2);
}
}
@ -62,4 +68,11 @@ public class UserlistAdapter extends ViewPagerAdapter {
}
return fragment;
}
/**
*
*/
public void setId(long id) {
this.id = id;
}
}

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.ui.adapter.viewpager;
import androidx.annotation.IntRange;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@ -13,25 +14,19 @@ import java.util.Random;
*/
public abstract class ViewPagerAdapter extends FragmentStateAdapter {
private static final Random RND = new Random();
private static final Random RAND = new Random();
private ListFragment.ItemViewModel viewModel;
private int count;
private long[] ids;
private int count = 0;
private long[] ids = {};
/**
*
*/
protected ViewPagerAdapter(FragmentActivity fragmentActivity, int count) {
protected ViewPagerAdapter(FragmentActivity fragmentActivity) {
super(fragmentActivity);
viewModel = new ViewModelProvider(fragmentActivity).get(ListFragment.ItemViewModel.class);
this.count = count;
// create fragment session IDs
ids = new long[count];
for (int i = 0 ; i < ids.length ; i++) {
ids[i] = RND.nextLong();
}
}
@ -57,6 +52,20 @@ public abstract class ViewPagerAdapter extends FragmentStateAdapter {
return false;
}
/**
* set page count
*
* @param count number of pages
*/
public void setPageCount(@IntRange(from = 1) int count) {
this.count = count;
// create fragment session IDs
ids = new long[count];
for (int i = 0; i < ids.length; i++) {
ids[i] = RAND.nextLong();
}
}
/**
* called when app settings change
*/

View File

@ -47,8 +47,7 @@ public class FieldFragment extends ListFragment implements OnLinkClickListener,
}
}
setAdapter(adapter);
UserLoader.Param userParam = new UserLoader.Param(UserLoader.Param.ONLINE, id);
userLoader.execute(userParam, this);
load();
setRefresh(true);
}
@ -61,6 +60,13 @@ public class FieldFragment extends ListFragment implements OnLinkClickListener,
}
@Override
public void onDestroy() {
userLoader.cancel();
super.onDestroy();
}
@Override
public void onLinkClick(String url) {
LinkUtils.openLink(requireActivity(), url);
@ -69,8 +75,7 @@ public class FieldFragment extends ListFragment implements OnLinkClickListener,
@Override
protected void onReload() {
UserLoader.Param userParam = new UserLoader.Param(UserLoader.Param.ONLINE, id);
userLoader.execute(userParam, this);
load();
}
@ -78,8 +83,8 @@ public class FieldFragment extends ListFragment implements OnLinkClickListener,
protected void onReset() {
// reload adapter items
adapter.clear();
UserLoader.Param userParam = new UserLoader.Param(UserLoader.Param.ONLINE, id);
userLoader.execute(userParam, this);
userLoader = new UserLoader(requireContext());
load();
setRefresh(true);
}
@ -98,4 +103,12 @@ public class FieldFragment extends ListFragment implements OnLinkClickListener,
}
setRefresh(false);
}
/**
*
*/
private void load() {
UserLoader.Param userParam = new UserLoader.Param(UserLoader.Param.ONLINE, id);
userLoader.execute(userParam, this);
}
}

View File

@ -58,6 +58,7 @@ public class FilterFragment extends ListFragment implements OnFilterClickListene
@Override
public void onDestroy() {
filterLoader.cancel();
filterAction.cancel();
super.onDestroy();
}

View File

@ -131,6 +131,7 @@ public class HashtagFragment extends ListFragment implements OnHashtagClickListe
@Override
public void onDestroy() {
hashtagLoader.cancel();
hashtagAction.cancel();
super.onDestroy();
}
@ -139,6 +140,7 @@ public class HashtagFragment extends ListFragment implements OnHashtagClickListe
protected void onReset() {
adapter.clear();
hashtagLoader = new HashtagLoader(requireContext());
hashtagAction = new HashtagAction(requireContext());
load(HashtagLoader.Param.NO_CURSOR, HashtagAdapter.CLEAR_LIST);
setRefresh(true);
}

View File

@ -33,7 +33,14 @@ import org.nuclearfog.twidda.config.GlobalSettings;
*/
public abstract class ListFragment extends Fragment implements OnRefreshListener, RefreshCallback, Observer<String> {
/**
* used by {@link ItemViewModel} to notify {@link ListFragment} subclasses to scroll the lists to the first position
*/
public static final String NOTIFY_SCROLL_TOP = "refresh";
/**
* used by {@link ItemViewModel} to notify {@link ListFragment} subclassed that settings may have changed
*/
public static final String NOTIFY_CHANGED = "settings_changed";
/**
@ -145,15 +152,25 @@ public abstract class ListFragment extends Fragment implements OnRefreshListener
*/
protected abstract void onReset();
/**
* View model used by Activities to communicate with {@link ListFragment} subclasses
*/
public static class ItemViewModel extends ViewModel {
private final MutableLiveData<String> selectedItem = new MutableLiveData<>();
/**
* send notification to {@link ListFragment} subclasses
*
* @param s notification type {@link ListFragment#NOTIFY_CHANGED,#ListFragment#NOTIFY_SCROLL_TOP}
*/
public void notify(String s) {
selectedItem.setValue(s);
}
/**
*
*/
public LiveData<String> getSelectedItem() {
return selectedItem;
}

View File

@ -46,14 +46,13 @@ public class ScheduleFragment extends ListFragment implements OnScheduleClickLis
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
scheduleLoader = new ScheduleLoader(requireContext());
scheduleAction = new ScheduleAction(requireContext());
adapter = new ScheduleAdapter(this);
confirm = new ConfirmDialog(requireActivity(), this);
timepicker = new TimePickerDialog(requireActivity(), this);
setAdapter(adapter);
setAdapter(adapter);
if (savedInstanceState != null) {
Object data = savedInstanceState.getSerializable(KEY_SAVE);
if (data instanceof ScheduledStatuses) {
@ -72,6 +71,14 @@ public class ScheduleFragment extends ListFragment implements OnScheduleClickLis
}
@Override
public void onDestroy() {
scheduleLoader.cancel();
scheduleAction.cancel();
super.onDestroy();
}
@Override
protected void onReload() {
load(adapter.getTopItemId(), 0L, 0);
@ -81,6 +88,8 @@ public class ScheduleFragment extends ListFragment implements OnScheduleClickLis
@Override
protected void onReset() {
adapter.clear();
scheduleLoader = new ScheduleLoader(requireContext());
scheduleAction = new ScheduleAction(requireContext());
load(0L, 0L, CLEAR_LIST);
setRefresh(true);
}

View File

@ -37,6 +37,7 @@ public class LockableConstraintLayout extends ConstraintLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_SCROLL:
case MotionEvent.ACTION_MOVE:
float deltaY = ev.getAxisValue(MotionEvent.AXIS_Y) - yPos;
// detect scroll down, then aquire scroll lock
@ -45,11 +46,13 @@ public class LockableConstraintLayout extends ConstraintLayout {
}
// fall through
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_DOWN:
// note the current coordinates touch event
yPos = ev.getAxisValue(MotionEvent.AXIS_Y);
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
yLock = false;

View File

@ -239,6 +239,7 @@
<string name="settings_enable_indicators">zeige zusätzliche Status Informationen an</string>
<string name="login_key_enable">Token einfügen</string>
<string name="login_key_enable_v2">API v2 nutzen</string>
<string name="info_hashtag_following">folge Hashtag..</string>
<string name="info_open_mastodon_login">öffne Mastodon Loginseite</string>
<string name="info_login_to_mastodon">in Mastodon einloggen</string>
<string name="error_service_unavailable">Service zur Zeit nicht verfügbar!</string>

View File

@ -8,11 +8,6 @@
<item>@drawable/bell</item>
</integer-array>
<integer-array name="search_tab_icons">
<item>@drawable/search</item>
<item>@drawable/user</item>
</integer-array>
<integer-array name="search_hashtag_tab_icons">
<item>@drawable/search</item>
<item>@drawable/user</item>
@ -64,7 +59,11 @@
<item>@drawable/info</item>
</integer-array>
<integer-array name="userlist_tab_icons">
<integer-array name="userlist_tab_ownership_icons">
<item>@drawable/following</item>
</integer-array>
<integer-array name="userlist_tab_ownership_membership_icons">
<item>@drawable/following</item>
</integer-array>