From f92dd04a314bdbd32a4c824b3bc80021eb3c5026 Mon Sep 17 00:00:00 2001 From: Twig N Date: Mon, 6 Jan 2020 21:47:47 +1100 Subject: [PATCH] - moved most of remoterss/RemoteRssActivity code into RssfeedsActivity - RemoteRssFragment now extends android.support.v4.app.Fragment - removed swipeRefreshLayout --- .../core/gui/remoterss/RemoteRssActivity.java | 230 +++++++++--------- .../core/gui/remoterss/RemoteRssFragment.java | 85 +++---- .../core/gui/rss/RssfeedsActivity.java | 140 ++++++++++- .../main/res/layout/fragment_remoterss.xml | 17 +- 4 files changed, 296 insertions(+), 176 deletions(-) diff --git a/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssActivity.java b/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssActivity.java index 56445861..15eca9a2 100644 --- a/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssActivity.java @@ -72,24 +72,24 @@ import java.util.List; * @author Twig Nguyen */ @EActivity(R.layout.activity_remoterss) -public class RemoteRssActivity extends AppCompatActivity implements RefreshableActivity { - @NonConfigurationInstance - protected ArrayList feeds; +public class RemoteRssActivity extends AppCompatActivity { +// @NonConfigurationInstance +// protected ArrayList feeds; - @InstanceState - protected int selectedFilter; +// @InstanceState +// protected int selectedFilter; - @NonConfigurationInstance - protected ArrayList recentItems; +// @NonConfigurationInstance +// protected ArrayList recentItems; // Server connection @Bean protected ApplicationSettings applicationSettings; @Bean protected Log log; - @Bean - protected ConnectivityHelper connectivityHelper; - private IDaemonAdapter currentConnection; +// @Bean +// protected ConnectivityHelper connectivityHelper; +// private IDaemonAdapter currentConnection; // Details view components @ViewById @@ -122,71 +122,71 @@ public class RemoteRssActivity extends AppCompatActivity implements RefreshableA setSupportActionBar(torrentsToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - // Connect to the last used server - ServerSetting lastUsed = applicationSettings.getLastUsedServer(); - currentConnection = lastUsed.createServerAdapter(connectivityHelper.getConnectedNetworkName(), this); - - if (feeds != null) { - // Called from a configuration change. No need to load anything from server - showChannelFilters(); - fragmentRemoteRss.updateRemoteItems( - selectedFilter == 0 ? recentItems : feeds.get(selectedFilter - 1).getItems(), - false /* allow android to restore scroll position */ ); - } else { - loadFeeds(); - } - - } - - @Background - protected void loadFeeds() { - try { - fragmentRemoteRss.setRefreshing(true); - feeds = ((RemoteRssSupplier) (currentConnection)).getRemoteRssChannels(log); - fragmentRemoteRss.setRefreshing(false); - } catch (DaemonException e) { - onCommunicationError(e); - } - - recentItems = new ArrayList<>(); - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.MONTH, -1); - Date oneMonthAgo = calendar.getTime(); - - for (RemoteRssChannel feed : feeds) { - for (RemoteRssItem item : feed.getItems()) { - if (item.getTimestamp().after(oneMonthAgo)) { - recentItems.add(item); - } - } - } - // Sort by -newest - Collections.sort(recentItems, new Comparator() { - @Override - public int compare(RemoteRssItem lhs, RemoteRssItem rhs) { - return rhs.getTimestamp().compareTo(lhs.getTimestamp()); - } - }); +// // Connect to the last used server +// ServerSetting lastUsed = applicationSettings.getLastUsedServer(); +// currentConnection = lastUsed.createServerAdapter(connectivityHelper.getConnectedNetworkName(), this); +// +// if (feeds != null) { +// // Called from a configuration change. No need to load anything from server +// showChannelFilters(); +// fragmentRemoteRss.updateRemoteItems( +// selectedFilter == 0 ? recentItems : feeds.get(selectedFilter - 1).getItems(), +// false /* allow android to restore scroll position */ ); +// } else { +// loadFeeds(); +// } - afterLoadFeeds(); } - @UiThread - protected void afterLoadFeeds() { - // We need to wrap these calls in a @UiThread rather than make them each a @UiThread themselves - // because they need to run sequentially in a configuration change scenario in order for Android - // to maintain scroll position on the fragment adapter. - showChannelFilters(); - onFeedSelected(selectedFilter); - } - - @UiThread - protected void onCommunicationError(DaemonException daemonException) { - //noinspection ThrowableResultOfMethodCallIgnored - log.i(this, daemonException.toString()); - String error = getString(LocalTorrent.getResourceForDaemonException(daemonException)); - SnackbarManager.show(Snackbar.with(this).text(error).colorResource(R.color.red).type(SnackbarType.MULTI_LINE)); - } +// @Background +// protected void loadFeeds() { +// try { +// fragmentRemoteRss.setRefreshing(true); +// feeds = ((RemoteRssSupplier) (currentConnection)).getRemoteRssChannels(log); +// fragmentRemoteRss.setRefreshing(false); +// } catch (DaemonException e) { +// onCommunicationError(e); +// } +// +// recentItems = new ArrayList<>(); +// Calendar calendar = Calendar.getInstance(); +// calendar.add(Calendar.MONTH, -1); +// Date oneMonthAgo = calendar.getTime(); +// +// for (RemoteRssChannel feed : feeds) { +// for (RemoteRssItem item : feed.getItems()) { +// if (item.getTimestamp().after(oneMonthAgo)) { +// recentItems.add(item); +// } +// } +// } +// // Sort by -newest +// Collections.sort(recentItems, new Comparator() { +// @Override +// public int compare(RemoteRssItem lhs, RemoteRssItem rhs) { +// return rhs.getTimestamp().compareTo(lhs.getTimestamp()); +// } +// }); +// +// afterLoadFeeds(); +// } + +// @UiThread +// protected void afterLoadFeeds() { +// // We need to wrap these calls in a @UiThread rather than make them each a @UiThread themselves +// // because they need to run sequentially in a configuration change scenario in order for Android +// // to maintain scroll position on the fragment adapter. +// showChannelFilters(); +// onFeedSelected(selectedFilter); +// } + +// @UiThread +// protected void onCommunicationError(DaemonException daemonException) { +// //noinspection ThrowableResultOfMethodCallIgnored +// log.i(this, daemonException.toString()); +// String error = getString(LocalTorrent.getResourceForDaemonException(daemonException)); +// SnackbarManager.show(Snackbar.with(this).text(error).colorResource(R.color.red).type(SnackbarType.MULTI_LINE)); +// } @TargetApi(Build.VERSION_CODES.HONEYCOMB) @@ -208,49 +208,49 @@ public class RemoteRssActivity extends AppCompatActivity implements RefreshableA } } - private void showChannelFilters() { - List feedLabels = new ArrayList<>(feeds.size() +1); - feedLabels.add(new RemoteRssChannel() { - @Override - public String getName() { - return getString(R.string.remoterss_filter_allrecent); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - } - }); - feedLabels.addAll(feeds); - - drawerList.setAdapter(new SimpleListItemAdapter(this, feedLabels)); + private void showChannelFilters() { +// List feedLabels = new ArrayList<>(feeds.size() +1); +// feedLabels.add(new RemoteRssChannel() { +// @Override +// public String getName() { +// return getString(R.string.remoterss_filter_allrecent); +// } +// +// @Override +// public void writeToParcel(Parcel dest, int flags) { +// } +// }); +// feedLabels.addAll(feeds); +// +// drawerList.setAdapter(new SimpleListItemAdapter(this, feedLabels)); } - @ItemClick(R.id.drawer_list) - protected void onFeedSelected(int position) { - selectedFilter = position; - fragmentRemoteRss.updateRemoteItems(position == 0 ? recentItems : feeds.get(position - 1).getItems(), true); - - RemoteRssChannel channel = (RemoteRssChannel) drawerList.getAdapter().getItem(position); - getSupportActionBar().setSubtitle(channel.getName()); - - drawerLayout.closeDrawers(); - } - - public IDaemonAdapter getCurrentConnection() { - return currentConnection; - } - - public RemoteRssChannel getChannel(String name) { - for (RemoteRssChannel feed : feeds) { - if (feed.getName().equals(name)) { - return feed; - } - } - return null; - } - - @Override - public void refreshScreen() { - loadFeeds(); - } +// @ItemClick(R.id.drawer_list) +// protected void onFeedSelected(int position) { +// selectedFilter = position; +// fragmentRemoteRss.updateRemoteItems(position == 0 ? recentItems : feeds.get(position - 1).getItems(), true); +// +// RemoteRssChannel channel = (RemoteRssChannel) drawerList.getAdapter().getItem(position); +// getSupportActionBar().setSubtitle(channel.getName()); +// +// drawerLayout.closeDrawers(); +// } + +// public IDaemonAdapter getCurrentConnection() { +// return currentConnection; +// } + +// public RemoteRssChannel getChannel(String name) { +// for (RemoteRssChannel feed : feeds) { +// if (feed.getName().equals(name)) { +// return feed; +// } +// } +// return null; +// } + +// @Override +// public void refreshScreen() { +// loadFeeds(); +// } } diff --git a/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssFragment.java b/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssFragment.java index fe51e925..9560bc48 100644 --- a/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssFragment.java +++ b/app/src/main/java/org/transdroid/core/gui/remoterss/RemoteRssFragment.java @@ -17,7 +17,7 @@ package org.transdroid.core.gui.remoterss; -import android.app.Fragment; +import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.ActionMenuView; import android.view.View; @@ -41,6 +41,7 @@ import org.transdroid.core.gui.log.Log; import org.transdroid.core.gui.navigation.RefreshableActivity; import org.transdroid.core.gui.remoterss.data.RemoteRssItem; import org.transdroid.core.gui.remoterss.data.RemoteRssSupplier; +import org.transdroid.core.gui.rss.RssfeedsActivity; import org.transdroid.daemon.DaemonException; import org.transdroid.daemon.task.DaemonTaskSuccessResult; @@ -66,8 +67,6 @@ public class RemoteRssFragment extends Fragment { @ViewById(R.id.contextual_menu) protected ActionMenuView contextualMenu; @ViewById - protected SwipeRefreshLayout swipeRefreshLayout; - @ViewById protected ListView torrentsList; @ViewById protected TextView remoterssStatusMessage; @@ -94,16 +93,12 @@ public class RemoteRssFragment extends Fragment { adapter = new RemoteRssItemsAdapter(getActivity()); torrentsList.setAdapter(adapter); torrentsList.setFastScrollEnabled(true); + } - // Allow pulls on the list view to refresh the torrents - if (getActivity() != null && getActivity() instanceof RefreshableActivity) { - swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - ((RefreshableActivity) getActivity()).refreshScreen(); - } - }); - } + @Override + public void onResume() { + super.onResume(); + ((RssfeedsActivity) getActivity()).refreshRemoteFeeds(); } /** @@ -123,12 +118,6 @@ public class RemoteRssFragment extends Fragment { remoterssStatusMessage.setVisibility(View.VISIBLE); remoterssStatusMessage.setText(R.string.remoterss_no_files); } - swipeRefreshLayout.setRefreshing(false); - } - - @UiThread - public void setRefreshing(boolean refreshing) { - swipeRefreshLayout.setRefreshing(refreshing); } /** @@ -137,36 +126,38 @@ public class RemoteRssFragment extends Fragment { @ItemClick(resName = "torrents_list") protected void detailsListClicked(int position) { RemoteRssItem item = (RemoteRssItem) adapter.getItem(position); - downloadRemoteRssItem(item); - } +// downloadRemoteRssItem(item); - /** - * Download the item in a background thread and display success/fail accordingly. - */ - @Background - protected void downloadRemoteRssItem(RemoteRssItem item) { - final RemoteRssActivity activity = (RemoteRssActivity) getActivity(); - final RemoteRssSupplier supplier = (RemoteRssSupplier) activity.getCurrentConnection(); - - try { - supplier.downloadRemoteRssItem(log, item, activity.getChannel(item.getSourceName())); - onTaskSucceeded(null, getString(R.string.result_added, item.getTitle())); - } catch (DaemonException e) { - onTaskFailed(getString(LocalTorrent.getResourceForDaemonException(e))); - } - } - - @UiThread - protected void onTaskSucceeded(DaemonTaskSuccessResult result, String successMessage) { - SnackbarManager.show(Snackbar.with(getActivity()).text(successMessage)); + ((RssfeedsActivity) getActivity()).downloadRemoteRssItem(item); } - @UiThread - protected void onTaskFailed(String message) { - SnackbarManager.show(Snackbar.with(getActivity()) - .text(message) - .colorResource(R.color.red) - .type(SnackbarType.MULTI_LINE) - ); - } +// /** +// * Download the item in a background thread and display success/fail accordingly. +// */ +// @Background +// protected void downloadRemoteRssItem(RemoteRssItem item) { +// final RemoteRssActivity activity = (RemoteRssActivity) getActivity(); +// final RemoteRssSupplier supplier = (RemoteRssSupplier) activity.getCurrentConnection(); +// +// try { +// supplier.downloadRemoteRssItem(log, item, activity.getChannel(item.getSourceName())); +// onTaskSucceeded(null, getString(R.string.result_added, item.getTitle())); +// } catch (DaemonException e) { +// onTaskFailed(getString(LocalTorrent.getResourceForDaemonException(e))); +// } +// } +// +// @UiThread +// protected void onTaskSucceeded(DaemonTaskSuccessResult result, String successMessage) { +// SnackbarManager.show(Snackbar.with(getActivity()).text(successMessage)); +// } +// +// @UiThread +// protected void onTaskFailed(String message) { +// SnackbarManager.show(Snackbar.with(getActivity()) +// .text(message) +// .colorResource(R.color.red) +// .type(SnackbarType.MULTI_LINE) +// ); +// } } diff --git a/app/src/main/java/org/transdroid/core/gui/rss/RssfeedsActivity.java b/app/src/main/java/org/transdroid/core/gui/rss/RssfeedsActivity.java index 8925d937..257c855d 100644 --- a/app/src/main/java/org/transdroid/core/gui/rss/RssfeedsActivity.java +++ b/app/src/main/java/org/transdroid/core/gui/rss/RssfeedsActivity.java @@ -33,26 +33,43 @@ import android.text.TextUtils; import com.nispok.snackbar.Snackbar; import com.nispok.snackbar.SnackbarManager; +import com.nispok.snackbar.enums.SnackbarType; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.FragmentById; +import org.androidannotations.annotations.InstanceState; +import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import org.transdroid.R; import org.transdroid.core.app.settings.ApplicationSettings; import org.transdroid.core.app.settings.RssfeedSetting; +import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.app.settings.SystemSettings_; import org.transdroid.core.gui.TorrentsActivity_; +import org.transdroid.core.gui.lists.LocalTorrent; import org.transdroid.core.gui.log.Log; import org.transdroid.core.gui.navigation.NavigationHelper; +import org.transdroid.core.gui.remoterss.RemoteRssFragment; +import org.transdroid.core.gui.remoterss.RemoteRssFragment_; +import org.transdroid.core.gui.remoterss.data.RemoteRssChannel; +import org.transdroid.core.gui.remoterss.data.RemoteRssItem; +import org.transdroid.core.gui.remoterss.data.RemoteRssSupplier; import org.transdroid.core.rssparser.Channel; import org.transdroid.core.rssparser.RssParser; +import org.transdroid.core.service.ConnectivityHelper; +import org.transdroid.daemon.DaemonException; +import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.task.DaemonTaskSuccessResult; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.List; @@ -64,10 +81,12 @@ public class RssfeedsActivity extends AppCompatActivity { protected Log log; @Bean protected ApplicationSettings applicationSettings; + protected List loaders; // Contained feeds and items fragments protected RssfeedsFragment fragmentFeeds; + protected RemoteRssFragment fragmentRemoteFeeds; @FragmentById(R.id.rssitems_fragment) protected RssitemsFragment fragmentItems; @ViewById @@ -80,6 +99,17 @@ public class RssfeedsActivity extends AppCompatActivity { protected static final int RSS_FEEDS_LOCAL = 0; protected static final int RSS_FEEDS_REMOTE = 1; + // remote RSS stuff + @NonConfigurationInstance + protected ArrayList feeds; + @InstanceState + protected int selectedFilter; + @NonConfigurationInstance + protected ArrayList recentItems; + @Bean + protected ConnectivityHelper connectivityHelper; + + class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(FragmentManager fm) { super(fm); @@ -93,7 +123,7 @@ public class RssfeedsActivity extends AppCompatActivity { fragment = fragmentFeeds; } else if (position == RSS_FEEDS_REMOTE) { - fragment = null; + fragment = fragmentRemoteFeeds; } return fragment; @@ -134,7 +164,7 @@ public class RssfeedsActivity extends AppCompatActivity { getSupportActionBar().setDisplayHomeAsUpEnabled(true); fragmentFeeds = RssfeedsFragment_.builder().build(); - fragmentItems = RssitemsFragment_.builder().build(); + fragmentRemoteFeeds = RemoteRssFragment_.builder().build(); PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(pagerAdapter); @@ -180,7 +210,6 @@ public class RssfeedsActivity extends AppCompatActivity { handleRssfeedResult(loader, null, true); log.i(this, "RSS feed " + loader.getSetting().getUrl() + " error: " + e.toString()); } - } /** @@ -250,7 +279,112 @@ public class RssfeedsActivity extends AppCompatActivity { .requiresExternalAuthentication(loader.getSetting().requiresExternalAuthentication()).start(); } + } + + protected IDaemonAdapter getCurrentConnection() { + ServerSetting lastUsed = applicationSettings.getLastUsedServer(); + return lastUsed.createServerAdapter(connectivityHelper.getConnectedNetworkName(), this); + } + + public void refreshRemoteFeeds() { + // Connect to the last used server + IDaemonAdapter currentConnection = this.getCurrentConnection(); + + // remote rss not supported for this connection type + if (currentConnection instanceof RemoteRssSupplier == false) { + return; + } + + try { + feeds = ((RemoteRssSupplier) (currentConnection)).getRemoteRssChannels(log); + + // loadFeeds() in background + recentItems = new ArrayList<>(); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MONTH, -1); + Date oneMonthAgo = calendar.getTime(); + + for (RemoteRssChannel feed : feeds) { + for (RemoteRssItem item : feed.getItems()) { + if (item.getTimestamp().after(oneMonthAgo)) { + recentItems.add(item); + } + } + } + + // Sort by -newest + Collections.sort(recentItems, new Comparator() { + @Override + public int compare(RemoteRssItem lhs, RemoteRssItem rhs) { + return rhs.getTimestamp().compareTo(lhs.getTimestamp()); + } + }); + } catch (DaemonException e) { + onCommunicationError(e); + return; + } + +// if (feeds != null) { + // Called from a configuration change. No need to load anything from server +// showChannelFilters(); + fragmentRemoteFeeds.updateRemoteItems( +// selectedFilter == 0 ? recentItems : feeds.get(selectedFilter).getItems(), + recentItems, + false /* allow android to restore scroll position */ ); +// } else { +// loadFeeds(); +// } + } + + @UiThread + protected void onCommunicationError(DaemonException daemonException) { + //noinspection ThrowableResultOfMethodCallIgnored + log.i(this, daemonException.toString()); + String error = getString(LocalTorrent.getResourceForDaemonException(daemonException)); + SnackbarManager.show(Snackbar.with(this).text(error).colorResource(R.color.red).type(SnackbarType.MULTI_LINE)); + } + + +// @ItemClick(R.id.drawer_list) + protected void onFeedSelected(int position) { + selectedFilter = position; + RemoteRssChannel channel = feeds.get(position); + + fragmentRemoteFeeds.updateRemoteItems(position == 0 ? recentItems : channel.getItems(), true); + +// RemoteRssChannel channel = (RemoteRssChannel) drawerList.getAdapter().getItem(position); +// getSupportActionBar().setSubtitle(channel.getName()); + +// drawerLayout.closeDrawers(); + } + + /** + * Download the item in a background thread and display success/fail accordingly. + */ + @Background + public void downloadRemoteRssItem(RemoteRssItem item) { + final RemoteRssSupplier supplier = (RemoteRssSupplier) this.getCurrentConnection(); + + try { + RemoteRssChannel channel = feeds.get(selectedFilter); + supplier.downloadRemoteRssItem(log, item, channel); + onTaskSucceeded(null, getString(R.string.result_added, item.getTitle())); + } catch (DaemonException e) { + onTaskFailed(getString(LocalTorrent.getResourceForDaemonException(e))); + } + } + @UiThread + protected void onTaskSucceeded(DaemonTaskSuccessResult result, String successMessage) { + SnackbarManager.show(Snackbar.with(this).text(successMessage)); } + @UiThread + protected void onTaskFailed(String message) { + SnackbarManager.show(Snackbar.with(this) + .text(message) + .colorResource(R.color.red) + .type(SnackbarType.MULTI_LINE) + ); + } } diff --git a/app/src/main/res/layout/fragment_remoterss.xml b/app/src/main/res/layout/fragment_remoterss.xml index c3811430..fe10b7c6 100644 --- a/app/src/main/res/layout/fragment_remoterss.xml +++ b/app/src/main/res/layout/fragment_remoterss.xml @@ -27,16 +27,11 @@ android:gravity="center" android:id="@+id/remoterss_status_message"/> - - - + android:layout_height="match_parent" + android:clipToPadding="false" + tools:listitem="@layout/list_item_remoterssitem" + tools:visibility="visible"/>