added list fragment superclass, removed redundant code

This commit is contained in:
nuclearfog 2020-11-01 12:32:48 +01:00
parent 567c31850d
commit 66cdcec840
No known key found for this signature in database
GPG Key ID: D5490E4A81F97B14
7 changed files with 268 additions and 400 deletions

View File

@ -7,6 +7,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import org.nuclearfog.twidda.fragment.ListFragment;
import org.nuclearfog.twidda.fragment.MessageFragment;
import org.nuclearfog.twidda.fragment.TrendFragment;
import org.nuclearfog.twidda.fragment.TweetFragment;
@ -44,7 +45,7 @@ import static org.nuclearfog.twidda.fragment.UserListFragment.LIST_USER_SUBSCR_T
*/
public class FragmentAdapter extends FragmentStatePagerAdapter {
private Fragment[] fragments;
private ListFragment[] fragments;
/**
* Initialize Fragment Adapter
@ -53,7 +54,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
*/
public FragmentAdapter(FragmentManager fManager) {
super(fManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
fragments = new Fragment[0];
fragments = new ListFragment[0];
}
@ -82,7 +83,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* Clear all fragments
*/
public void clear() {
fragments = new Fragment[0];
fragments = new ListFragment[0];
notifyDataSetChanged();
}
@ -94,7 +95,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
Bundle ment_tl = new Bundle();
home_tl.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_HOME);
ment_tl.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_MENT);
fragments = new Fragment[3];
fragments = new ListFragment[3];
fragments[0] = new TweetFragment();
fragments[1] = new TrendFragment();
fragments[2] = new TweetFragment();
@ -115,7 +116,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
usr_favor.putLong(KEY_FRAG_TWEET_ID, userId);
usr_tweet.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_TWEETS);
usr_favor.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_FAVORS);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new TweetFragment();
fragments[1] = new TweetFragment();
fragments[0].setArguments(usr_tweet);
@ -135,7 +136,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
usr_favor.putString(KEY_FRAG_TWEET_SEARCH, username);
usr_tweet.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_TWEETS);
usr_favor.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_FAVORS);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new TweetFragment();
fragments[1] = new TweetFragment();
fragments[0].setArguments(usr_tweet);
@ -155,7 +156,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
userSearch.putString(KEY_FRAG_USER_SEARCH, search);
tweetSearch.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_SEARCH);
userSearch.putInt(KEY_FRAG_USER_MODE, USER_FRAG_SEARCH);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new TweetFragment();
fragments[1] = new UserFragment();
fragments[0].setArguments(tweetSearch);
@ -174,7 +175,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
param.putInt(KEY_FRAG_TWEET_MODE, TWEET_FRAG_ANSWER);
param.putString(KEY_FRAG_TWEET_SEARCH, replyName);
param.putLong(KEY_FRAG_TWEET_ID, tweetId);
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new TweetFragment();
fragments[0].setArguments(param);
notifyDataSetChanged();
@ -189,7 +190,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
Bundle param = new Bundle();
param.putLong(KEY_FRAG_USER_ID, userId);
param.putInt(KEY_FRAG_USER_MODE, USER_FRAG_FRIENDS);
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new UserFragment();
fragments[0].setArguments(param);
notifyDataSetChanged();
@ -204,7 +205,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
Bundle param = new Bundle();
param.putLong(KEY_FRAG_USER_ID, userId);
param.putInt(KEY_FRAG_USER_MODE, USER_FRAG_FOLLOWS);
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new UserFragment();
fragments[0].setArguments(param);
notifyDataSetChanged();
@ -214,7 +215,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* setup adapter for a list of direct messages
*/
public void setupMessagePage() {
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new MessageFragment();
notifyDataSetChanged();
}
@ -228,7 +229,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
Bundle param = new Bundle();
param.putLong(KEY_FRAG_USER_ID, tweetId);
param.putInt(KEY_FRAG_USER_MODE, USER_FRAG_RETWEET);
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new UserFragment();
fragments[0].setArguments(param);
notifyDataSetChanged();
@ -246,7 +247,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
userListParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_OWNS);
subscriberParam.putLong(KEY_FRAG_LIST_OWNER_ID, userId);
subscriberParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_SUBSCR_TO);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new UserListFragment();
fragments[1] = new UserListFragment();
fragments[0].setArguments(userListParam);
@ -266,7 +267,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
userListParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_OWNS);
subscriberParam.putString(KEY_FRAG_LIST_OWNER_NAME, ownerName);
subscriberParam.putInt(KEY_FRAG_LIST_LIST_TYPE, LIST_USER_SUBSCR_TO);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new UserListFragment();
fragments[1] = new UserListFragment();
fragments[0].setArguments(userListParam);
@ -283,7 +284,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
Bundle param = new Bundle();
param.putLong(KEY_FRAG_USER_ID, listId);
param.putInt(KEY_FRAG_USER_MODE, USER_FRAG_SUBSCR);
fragments = new Fragment[1];
fragments = new ListFragment[1];
fragments[0] = new UserFragment();
fragments[0].setArguments(param);
notifyDataSetChanged();
@ -303,7 +304,7 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
userParam.putInt(KEY_FRAG_USER_MODE, USER_FRAG_LISTS);
userParam.putBoolean(KEY_FRAG_DEL_USER, ownerOfList);
userParam.putLong(KEY_FRAG_USER_ID, listId);
fragments = new Fragment[2];
fragments = new ListFragment[2];
fragments[0] = new TweetFragment();
fragments[1] = new UserFragment();
fragments[0].setArguments(tweetParam);
@ -315,10 +316,8 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* called when app settings change
*/
public void notifySettingsChanged() {
for (Fragment fragment : fragments) {
if (fragment instanceof FragmentChangeObserver) {
((FragmentChangeObserver) fragment).onReset();
}
for (ListFragment fragment : fragments) {
fragment.reset();
}
}
@ -328,22 +327,6 @@ public class FragmentAdapter extends FragmentStatePagerAdapter {
* @param index tab position of page
*/
public void scrollToTop(int index) {
if (fragments[index] instanceof FragmentChangeObserver) {
((FragmentChangeObserver) fragments[index]).onTabChange();
}
}
public interface FragmentChangeObserver {
/**
* called if settings changed to refresh fragments
*/
void onReset();
/**
* called when the current tab changes
*/
void onTabChange();
fragments[index].onTabChange();
}
}

View File

@ -0,0 +1,119 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.database.GlobalSettings;
/**
* this fragment class hosts a list view inside a swipe view
* superclass for all list fragments
*/
public abstract class ListFragment extends Fragment implements OnRefreshListener {
/**
* delay to enable swipe view in milliseconds
*/
private static final int REFRESH_DELAY = 500;
private RecyclerView list;
private SwipeRefreshLayout reload;
private GlobalSettings settings;
@Override
public final View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) {
Context context = requireContext();
settings = GlobalSettings.getInstance(context);
onCreate();
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setAdapter(initAdapter());
reload = new SwipeRefreshLayout(context);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
}
/**
* enables or disables swipe layout
*
* @param enable true to enable swipe view delayed, false to stop immediately
*/
protected void setRefresh(boolean enable) {
if (enable) {
reload.postDelayed(new Runnable() {
@Override
public void run() {
if (!reload.isRefreshing()) {
reload.setRefreshing(true);
}
}
}, REFRESH_DELAY);
} else {
reload.setRefreshing(false);
}
}
/**
* check if swipe refresh is active
*
* @return true if swipe view is active
*/
protected boolean isRefreshing() {
return reload.isRefreshing();
}
/**
* called to reset all data
*/
public void reset() {
if (reload != null && list != null) {
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
list.setAdapter(list.getAdapter()); // force redrawing list
setRefresh(true);
}
onReset();
}
/**
* called when this tab is deselected
*/
public void onTabChange() {
if (list != null) {
list.smoothScrollToPosition(0);
}
}
/**
* called to initialize sub classes
*/
abstract void onCreate();
/**
* initialize list adapter
*
* @return adapter for the recycler view list
*/
abstract Adapter<RecyclerView.ViewHolder> initAdapter();
/**
* called to reset all data
*/
abstract void onReset();
}

View File

@ -2,21 +2,10 @@ package org.nuclearfog.twidda.fragment;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.R;
@ -27,16 +16,15 @@ import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.MessageAdapter;
import org.nuclearfog.twidda.adapter.MessageAdapter.OnItemSelected;
import org.nuclearfog.twidda.backend.MessageListLoader;
import org.nuclearfog.twidda.backend.TrendListLoader;
import org.nuclearfog.twidda.backend.engine.EngineException;
import org.nuclearfog.twidda.backend.items.Message;
import org.nuclearfog.twidda.backend.utils.DialogBuilder;
import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick;
import org.nuclearfog.twidda.backend.utils.ErrorHandler;
import org.nuclearfog.twidda.database.GlobalSettings;
import java.util.List;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static android.widget.Toast.LENGTH_SHORT;
import static org.nuclearfog.twidda.activity.MessagePopup.KEY_DM_PREFIX;
@ -50,10 +38,10 @@ import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DEL_M
/**
* Fragment class for direct message lists
*/
public class MessageFragment extends Fragment implements OnRefreshListener, OnItemSelected, DialogBuilder.OnDialogClick {
public class MessageFragment extends ListFragment implements OnRefreshListener, OnItemSelected, OnDialogClick {
private GlobalSettings settings;
private MessageListLoader messageTask;
private SwipeRefreshLayout reload;
private MessageAdapter adapter;
private Dialog deleteDialog;
@ -61,23 +49,9 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) {
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
adapter = new MessageAdapter(this, settings);
RecyclerView list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
protected void onCreate() {
settings = GlobalSettings.getInstance(requireContext());
deleteDialog = DialogBuilder.create(requireContext(), DEL_MESSAGE, this);
reload = new SwipeRefreshLayout(context);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
}
@ -91,6 +65,13 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
}
@Override
protected void onReset() {
setRefresh(true);
load(MessageListLoader.Action.DB);
}
@Override
public void onDestroy() {
if (messageTask != null && messageTask.getStatus() == RUNNING)
@ -109,8 +90,8 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
@Override
public void onTagClick(String tag) {
if (getContext() != null && !reload.isRefreshing()) {
Intent intent = new Intent(getContext(), SearchPage.class);
if (!isRefreshing()) {
Intent intent = new Intent(requireContext(), SearchPage.class);
intent.putExtra(KEY_SEARCH_QUERY, tag);
startActivity(intent);
}
@ -119,27 +100,25 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
@Override
public void onLinkClick(String tag) {
if (getContext() != null) {
String shortLink = tag;
int cut = shortLink.indexOf('?');
if (cut > 0) {
shortLink = shortLink.substring(0, cut);
}
if (LINK_PATTERN.matcher(shortLink).matches()) {
String name = shortLink.substring(20, shortLink.indexOf('/', 20));
long id = Long.parseLong(shortLink.substring(shortLink.lastIndexOf('/') + 1));
Intent intent = new Intent(getContext(), TweetActivity.class);
intent.putExtra(KEY_TWEET_ID, id);
intent.putExtra(KEY_TWEET_NAME, name);
String shortLink = tag;
int cut = shortLink.indexOf('?');
if (cut > 0) {
shortLink = shortLink.substring(0, cut);
}
if (LINK_PATTERN.matcher(shortLink).matches()) {
String name = shortLink.substring(20, shortLink.indexOf('/', 20));
long id = Long.parseLong(shortLink.substring(shortLink.lastIndexOf('/') + 1));
Intent intent = new Intent(requireContext(), TweetActivity.class);
intent.putExtra(KEY_TWEET_ID, id);
intent.putExtra(KEY_TWEET_NAME, name);
startActivity(intent);
} else {
Uri link = Uri.parse(tag);
Intent intent = new Intent(Intent.ACTION_VIEW, link);
try {
startActivity(intent);
} else {
Uri link = Uri.parse(tag);
Intent intent = new Intent(Intent.ACTION_VIEW, link);
try {
startActivity(intent);
} catch (ActivityNotFoundException err) {
Toast.makeText(requireContext(), R.string.error_connection_failed, LENGTH_SHORT).show();
}
} catch (ActivityNotFoundException err) {
Toast.makeText(requireContext(), R.string.error_connection_failed, LENGTH_SHORT).show();
}
}
}
@ -147,10 +126,10 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
@Override
public void onClick(final Message message, Action action) {
if (getContext() != null && !reload.isRefreshing()) {
if (!isRefreshing()) {
switch (action) {
case ANSWER:
Intent sendDm = new Intent(getContext(), MessagePopup.class);
Intent sendDm = new Intent(requireContext(), MessagePopup.class);
sendDm.putExtra(KEY_DM_PREFIX, message.getSender().getScreenname());
startActivity(sendDm);
break;
@ -163,7 +142,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
break;
case PROFILE:
Intent profile = new Intent(getContext(), UserProfile.class);
Intent profile = new Intent(requireContext(), UserProfile.class);
profile.putExtra(KEY_PROFILE_ID, message.getSender().getId());
startActivity(profile);
break;
@ -171,6 +150,7 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
}
}
@Override
public void onConfirm(DialogBuilder.DialogType type) {
messageTask = new MessageListLoader(MessageFragment.this, MessageListLoader.Action.DEL);
@ -196,24 +176,11 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
adapter.remove(id);
}
/**
* called from {@link TrendListLoader} to enable or disable RefreshLayout
*
* @param enable true to enable RefreshLayout with delay
*/
public void setRefresh(boolean enable) {
if (enable) {
reload.postDelayed(new Runnable() {
@Override
public void run() {
if (messageTask != null && messageTask.getStatus() != FINISHED
&& !reload.isRefreshing())
reload.setRefreshing(true);
}
}, 500);
} else {
reload.setRefreshing(false);
}
@Override
protected MessageAdapter initAdapter() {
adapter = new MessageAdapter(this, settings);
return adapter;
}
/**
@ -222,8 +189,8 @@ public class MessageFragment extends Fragment implements OnRefreshListener, OnIt
* @param error Twitter exception
*/
public void onError(EngineException error) {
if (getContext() != null && error != null)
ErrorHandler.handleFailure(getContext(), error);
if (error != null)
ErrorHandler.handleFailure(requireContext(), error);
setRefresh(false);
}

View File

@ -1,22 +1,10 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.activity.SearchPage;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.TrendAdapter;
import org.nuclearfog.twidda.adapter.TrendAdapter.TrendClickListener;
import org.nuclearfog.twidda.backend.TrendListLoader;
@ -27,39 +15,22 @@ import org.nuclearfog.twidda.database.GlobalSettings;
import java.util.List;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.activity.SearchPage.KEY_SEARCH_QUERY;
/**
* Fragment class for trend lists
*/
public class TrendFragment extends Fragment implements OnRefreshListener, TrendClickListener, FragmentChangeObserver {
public class TrendFragment extends ListFragment implements OnRefreshListener, TrendClickListener {
private TrendListLoader trendTask;
private TrendAdapter adapter;
private GlobalSettings settings;
private SwipeRefreshLayout reload;
private RecyclerView list;
private TrendAdapter adapter;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) {
Context context = inflater.getContext();
settings = GlobalSettings.getInstance(context);
adapter = new TrendAdapter(this, settings);
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
reload = new SwipeRefreshLayout(context);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
protected void onCreate() {
settings = GlobalSettings.getInstance(requireContext());
}
@ -73,6 +44,13 @@ public class TrendFragment extends Fragment implements OnRefreshListener, TrendC
}
@Override
protected void onReset() {
setRefresh(true);
load();
}
@Override
public void onDestroy() {
if (trendTask != null && trendTask.getStatus() == RUNNING)
@ -81,6 +59,13 @@ public class TrendFragment extends Fragment implements OnRefreshListener, TrendC
}
@Override
protected TrendAdapter initAdapter() {
adapter = new TrendAdapter(this, settings);
return adapter;
}
@Override
public void onRefresh() {
if (trendTask != null && trendTask.getStatus() != RUNNING) {
@ -91,33 +76,13 @@ public class TrendFragment extends Fragment implements OnRefreshListener, TrendC
@Override
public void onTrendClick(TwitterTrend trend) {
if (!reload.isRefreshing()) {
if (!isRefreshing()) {
Intent intent = new Intent(getContext(), SearchPage.class);
intent.putExtra(KEY_SEARCH_QUERY, trend.getSearchString());
startActivity(intent);
}
}
@Override
public void onReset() {
if (reload != null && list != null && adapter != null) {
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
list.setAdapter(adapter); // force redrawing list
adapter.clear();
setRefresh(true);
load();
}
}
@Override
public void onTabChange() {
if (list != null) {
list.smoothScrollToPosition(0);
}
}
/**
* set trend data to list
*
@ -137,7 +102,6 @@ public class TrendFragment extends Fragment implements OnRefreshListener, TrendC
return adapter.isEmpty();
}
/**
* called from {@link TrendListLoader} if an error occurs
*
@ -149,26 +113,6 @@ public class TrendFragment extends Fragment implements OnRefreshListener, TrendC
setRefresh(false);
}
/**
* called from {@link TrendListLoader} to enable or disable RefreshLayout
*
* @param enable true to enable RefreshLayout with delay
*/
private void setRefresh(boolean enable) {
if (enable) {
reload.postDelayed(new Runnable() {
@Override
public void run() {
if (trendTask != null && trendTask.getStatus() != FINISHED
&& !reload.isRefreshing())
reload.setRefreshing(true);
}
}, 500);
} else {
reload.setRefreshing(false);
}
}
/**
* load content into the list
*/

View File

@ -1,22 +1,12 @@
package org.nuclearfog.twidda.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.activity.TweetActivity;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.TweetAdapter;
import org.nuclearfog.twidda.adapter.TweetAdapter.TweetClickListener;
import org.nuclearfog.twidda.backend.TweetListLoader;
@ -28,7 +18,6 @@ import org.nuclearfog.twidda.database.GlobalSettings;
import java.util.List;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.activity.TweetActivity.KEY_TWEET_ID;
import static org.nuclearfog.twidda.activity.TweetActivity.KEY_TWEET_NAME;
@ -36,7 +25,7 @@ import static org.nuclearfog.twidda.activity.TweetActivity.KEY_TWEET_NAME;
/**
* #Fragment class for a list of tweets
*/
public class TweetFragment extends Fragment implements OnRefreshListener, TweetClickListener, FragmentChangeObserver {
public class TweetFragment extends ListFragment implements OnRefreshListener, TweetClickListener {
/**
* Key to define what type of tweets should be loaded
@ -73,27 +62,13 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
private static final int REQUEST_TWEET_CHANGED = 2;
private TweetListLoader tweetTask;
private TweetAdapter adapter;
private GlobalSettings settings;
private SwipeRefreshLayout reload;
private RecyclerView list;
private TweetAdapter adapter;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) {
Context context = inflater.getContext();
settings = GlobalSettings.getInstance(context);
adapter = new TweetAdapter(this, settings);
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setAdapter(adapter);
reload = new SwipeRefreshLayout(context);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
protected void onCreate() {
settings = GlobalSettings.getInstance(requireContext());
}
@ -107,6 +82,13 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
}
@Override
protected void onReset() {
load(0, 0, CLEAR_LIST);
setRefresh(true);
}
@Override
public void onDestroy() {
if (tweetTask != null && tweetTask.getStatus() == RUNNING) {
@ -116,6 +98,13 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
}
@Override
protected TweetAdapter initAdapter() {
adapter = new TweetAdapter(this, settings);
return adapter;
}
@Override
public void onActivityResult(int reqCode, int returnCode, @Nullable Intent intent) {
if (intent != null && reqCode == REQUEST_TWEET_CHANGED && returnCode == RETURN_TWEET_CHANGED) {
@ -139,7 +128,7 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
@Override
public void onTweetClick(Tweet tweet) {
if (getContext() != null && !reload.isRefreshing()) {
if (getContext() != null && !isRefreshing()) {
if (tweet.getEmbeddedTweet() != null)
tweet = tweet.getEmbeddedTweet();
Intent tweetIntent = new Intent(getContext(), TweetActivity.class);
@ -158,24 +147,6 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
}
@Override
public void onReset() {
if (reload != null && list != null && adapter != null) {
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
list.setAdapter(adapter); // force redrawing list
load(0, 0, CLEAR_LIST);
setRefresh(true);
}
}
@Override
public void onTabChange() {
if (list != null) {
list.smoothScrollToPosition(0);
}
}
/**
* Set Tweet data to list
*
@ -205,26 +176,6 @@ public class TweetFragment extends Fragment implements OnRefreshListener, TweetC
}
/**
* called from {@link TweetListLoader} to enable or disable RefreshLayout
*
* @param enable true to enable RefreshLayout with delay
*/
private void setRefresh(boolean enable) {
if (enable) {
reload.postDelayed(new Runnable() {
@Override
public void run() {
if (tweetTask != null && tweetTask.getStatus() != FINISHED
&& !reload.isRefreshing())
reload.setRefreshing(true);
}
}, 500);
} else {
reload.setRefreshing(false);
}
}
/**
* load content into the list
*

View File

@ -1,25 +1,15 @@
package org.nuclearfog.twidda.fragment;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.UserAdapter;
import org.nuclearfog.twidda.adapter.UserAdapter.UserClickListener;
import org.nuclearfog.twidda.backend.UserListLoader;
@ -34,7 +24,6 @@ import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick;
import org.nuclearfog.twidda.backend.utils.ErrorHandler;
import org.nuclearfog.twidda.database.GlobalSettings;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID;
import static org.nuclearfog.twidda.backend.UserListLoader.NO_CURSOR;
@ -44,8 +33,8 @@ import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.DEL_U
/**
* Fragment class for lists a list of users
*/
public class UserFragment extends Fragment implements OnRefreshListener, UserClickListener,
FragmentChangeObserver, OnDialogClick, ListManagerCallback {
public class UserFragment extends ListFragment implements OnRefreshListener, UserClickListener,
OnDialogClick, ListManagerCallback {
/**
* key to set the type of user list to show
@ -77,9 +66,8 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
private UserListLoader userTask;
private UserListManager listTask;
private GlobalSettings settings;
private SwipeRefreshLayout reload;
private RecyclerView list;
private Dialog deleteDialog;
private UserAdapter adapter;
@ -89,17 +77,9 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
private int mode = 0;
private boolean delUser = false;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle b) {
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
adapter = new UserAdapter(this, settings);
list = new RecyclerView(context);
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
protected void onCreate() {
Bundle param = getArguments();
if (param != null) {
mode = param.getInt(KEY_FRAG_USER_MODE, 0);
@ -108,11 +88,7 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
delUser = param.getBoolean(KEY_FRAG_DEL_USER, false);
}
deleteDialog = DialogBuilder.create(requireContext(), DEL_USER_LIST, this);
reload = new SwipeRefreshLayout(context);
reload.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reload.setOnRefreshListener(this);
reload.addView(list);
return reload;
settings = GlobalSettings.getInstance(requireContext());
}
@ -125,6 +101,12 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
}
@Override
protected void onReset() {
load(NO_CURSOR);
}
@Override
public void onDestroy() {
if (userTask != null && userTask.getStatus() == RUNNING)
@ -133,6 +115,13 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
}
@Override
protected UserAdapter initAdapter() {
adapter = new UserAdapter(this, settings);
return adapter;
}
@Override
public void onRefresh() {
if (userTask != null && userTask.getStatus() != RUNNING) {
@ -143,8 +132,8 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
@Override
public void onUserClick(TwitterUser user) {
if (getContext() != null && !reload.isRefreshing()) {
Intent intent = new Intent(getContext(), UserProfile.class);
if (!isRefreshing()) {
Intent intent = new Intent(requireContext(), UserProfile.class);
intent.putExtra(KEY_PROFILE_ID, user.getId());
startActivity(intent);
}
@ -167,23 +156,6 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
}
@Override
public void onTabChange() {
if (list != null) {
list.smoothScrollToPosition(0);
}
}
@Override
public void onReset() {
if (list != null) {
list.setAdapter(adapter);
load(NO_CURSOR);
}
}
@Override
public void onConfirm(DialogBuilder.DialogType type) {
if (type == DEL_USER_LIST) {
@ -225,34 +197,13 @@ public class UserFragment extends Fragment implements OnRefreshListener, UserCli
* @param error Engine exception
*/
public void onError(@Nullable EngineException error) {
if (getContext() != null && error != null) {
ErrorHandler.handleFailure(getContext(), error);
if (error != null) {
ErrorHandler.handleFailure(requireContext(), error);
}
adapter.disableLoading();
setRefresh(false);
}
/**
* enables or disables swiperefresh
*
* @param enable true to enable RefreshLayout with delay
*/
private void setRefresh(boolean enable) {
if (enable) {
reload.postDelayed(new Runnable() {
@Override
public void run() {
if (userTask != null && userTask.getStatus() != FINISHED
&& !reload.isRefreshing()) {
reload.setRefreshing(true);
}
}
}, 500);
} else {
reload.setRefreshing(false);
}
}
/**
* load content into the list

View File

@ -1,27 +1,17 @@
package org.nuclearfog.twidda.fragment;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;
import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.activity.ListDetail;
import org.nuclearfog.twidda.activity.UserDetail;
import org.nuclearfog.twidda.activity.UserProfile;
import org.nuclearfog.twidda.adapter.FragmentAdapter.FragmentChangeObserver;
import org.nuclearfog.twidda.adapter.ListAdapter;
import org.nuclearfog.twidda.adapter.ListAdapter.ListClickListener;
import org.nuclearfog.twidda.backend.TwitterListLoader;
@ -33,7 +23,6 @@ import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick;
import org.nuclearfog.twidda.backend.utils.ErrorHandler;
import org.nuclearfog.twidda.database.GlobalSettings;
import static android.os.AsyncTask.Status.FINISHED;
import static android.os.AsyncTask.Status.RUNNING;
import static org.nuclearfog.twidda.activity.ListDetail.KEY_CURRENT_USER_OWNS;
import static org.nuclearfog.twidda.activity.ListDetail.KEY_LISTDETAIL_DESCR;
@ -55,8 +44,8 @@ import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.LIST_
/**
* Fragment class for user lists
*/
public class UserListFragment extends Fragment implements OnRefreshListener, ListClickListener,
FragmentChangeObserver, OnDialogClick {
public class UserListFragment extends ListFragment implements OnRefreshListener,
ListClickListener, OnDialogClick {
/**
* Key for the owner ID
@ -85,34 +74,19 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
public static final int LIST_USER_SUBSCR_TO = 2;
private TwitterListLoader listTask;
private SwipeRefreshLayout reloadLayout;
private RecyclerView list;
private ListAdapter adapter;
private GlobalSettings settings;
private Dialog followDialog, deleteDialog;
private ListAdapter adapter;
private long selectedList;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) {
Context context = inflater.getContext();
GlobalSettings settings = GlobalSettings.getInstance(context);
adapter = new ListAdapter(this, settings);
list = new RecyclerView(inflater.getContext());
list.setLayoutManager(new LinearLayoutManager(context));
list.setHasFixedSize(true);
list.setAdapter(adapter);
protected void onCreate() {
settings = GlobalSettings.getInstance(requireContext());
followDialog = DialogBuilder.create(requireContext(), LIST_UNFOLLOW, this);
deleteDialog = DialogBuilder.create(requireContext(), LIST_DELETE, this);
reloadLayout = new SwipeRefreshLayout(context);
reloadLayout.setProgressBackgroundColorSchemeColor(settings.getHighlightColor());
reloadLayout.setOnRefreshListener(this);
reloadLayout.addView(list);
return reloadLayout;
}
@ -126,6 +100,13 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
}
@Override
protected void onReset() {
setRefresh(true);
load(NO_CURSOR);
}
@Override
public void onDestroy() {
if (listTask != null && listTask.getStatus() == RUNNING)
@ -144,10 +125,10 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
@Override
public void onClick(final TwitterList listItem, Action action) {
if (getContext() != null && !reloadLayout.isRefreshing()) {
if (isRefreshing()) {
switch (action) {
case PROFILE:
Intent profile = new Intent(getContext(), UserProfile.class);
Intent profile = new Intent(requireContext(), UserProfile.class);
profile.putExtra(KEY_PROFILE_ID, listItem.getListOwner().getId());
startActivity(profile);
break;
@ -166,14 +147,14 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
break;
case SUBSCRIBER:
Intent subscriberIntent = new Intent(getContext(), UserDetail.class);
Intent subscriberIntent = new Intent(requireContext(), UserDetail.class);
subscriberIntent.putExtra(KEY_USERDETAIL_ID, listItem.getId());
subscriberIntent.putExtra(KEY_USERDETAIL_MODE, USERLIST_SUBSCRBR);
startActivity(subscriberIntent);
break;
case MEMBER:
Intent listIntent = new Intent(getContext(), ListDetail.class);
Intent listIntent = new Intent(requireContext(), ListDetail.class);
listIntent.putExtra(KEY_CURRENT_USER_OWNS, listItem.isListOwner());
listIntent.putExtra(KEY_LISTDETAIL_ID, listItem.getId());
listIntent.putExtra(KEY_LISTDETAIL_TITLE, listItem.getTitle());
@ -205,6 +186,7 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
}
@Override
public void onFooterClick(long cursor) {
if (listTask != null && listTask.getStatus() != RUNNING) {
load(cursor);
@ -213,20 +195,9 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
@Override
public void onReset() {
if (list != null) {
list.setAdapter(adapter);
setRefresh(true);
load(NO_CURSOR);
}
}
@Override
public void onTabChange() {
if (list != null) {
list.smoothScrollToPosition(0);
}
protected ListAdapter initAdapter() {
adapter = new ListAdapter(this, settings);
return adapter;
}
/**
@ -257,25 +228,7 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
adapter.removeItem(list);
}
/**
* called from {@link TwitterListLoader} to enable or disable RefreshLayout
*
* @param enable true to enable RefreshLayout with delay
*/
private void setRefresh(boolean enable) {
if (enable) {
reloadLayout.postDelayed(new Runnable() {
@Override
public void run() {
if (listTask != null && listTask.getStatus() != FINISHED
&& !reloadLayout.isRefreshing())
reloadLayout.setRefreshing(true);
}
}, 500);
} else {
reloadLayout.setRefreshing(false);
}
}
/**
* called from {@link TwitterListLoader} if an error occurs
@ -283,8 +236,8 @@ public class UserListFragment extends Fragment implements OnRefreshListener, Lis
* @param error Twitter exception
*/
public void onError(@Nullable EngineException error) {
if (getContext() != null && error != null)
ErrorHandler.handleFailure(getContext(), error);
if (error != null)
ErrorHandler.handleFailure(requireContext(), error);
adapter.disableLoading();
setRefresh(false);
}