From 66cdcec840f8e3c60f4780245db4a408fb78e191 Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sun, 1 Nov 2020 12:32:48 +0100 Subject: [PATCH] added list fragment superclass, removed redundant code --- .../twidda/adapter/FragmentAdapter.java | 57 +++------ .../twidda/fragment/ListFragment.java | 119 ++++++++++++++++++ .../twidda/fragment/MessageFragment.java | 119 +++++++----------- .../twidda/fragment/TrendFragment.java | 94 +++----------- .../twidda/fragment/TweetFragment.java | 87 +++---------- .../twidda/fragment/UserFragment.java | 95 ++++---------- .../twidda/fragment/UserListFragment.java | 97 ++++---------- 7 files changed, 268 insertions(+), 400 deletions(-) create mode 100644 app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/FragmentAdapter.java b/app/src/main/java/org/nuclearfog/twidda/adapter/FragmentAdapter.java index 1e494ef9..17613f31 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/FragmentAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/FragmentAdapter.java @@ -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(); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java new file mode 100644 index 00000000..b5e79392 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java @@ -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 initAdapter(); + + /** + * called to reset all data + */ + abstract void onReset(); +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java index a9d71d97..e3557fa0 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/MessageFragment.java @@ -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); } diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/TrendFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/TrendFragment.java index e6c225df..6662535b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/TrendFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/TrendFragment.java @@ -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 */ diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/TweetFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/TweetFragment.java index 29ed261a..b2faee82 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/TweetFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/TweetFragment.java @@ -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 * diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java index f13a3592..6eb0d126 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/UserFragment.java @@ -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 diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/UserListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/UserListFragment.java index 591c7fb2..1dbe1282 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/UserListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/UserListFragment.java @@ -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); }