limited access to feed items, feeds, playback history and download log

This commit is contained in:
daniel oeh 2013-02-24 12:30:23 +01:00
parent 56f199dc8c
commit f9e00f72a0
22 changed files with 276 additions and 141 deletions

View File

@ -30,7 +30,7 @@ public class DownloadLogActivity extends SherlockListActivity {
super.onCreate(savedInstanceState);
manager = FeedManager.getInstance();
dla = new DownloadLogAdapter(this, 0, manager.getDownloadLog());
dla = new DownloadLogAdapter(this);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setListAdapter(dla);
}

View File

@ -151,7 +151,7 @@ public class MainActivity extends SherlockFragmentActivity {
refreshAll.setVisible(true);
}
boolean hasFeeds = !manager.getFeeds().isEmpty();
boolean hasFeeds = manager.getFeedsSize() > 0;
menu.findItem(R.id.all_feed_refresh).setVisible(hasFeeds);
return true;
}

View File

@ -82,7 +82,7 @@ public class PreferenceActivity extends SherlockPreferenceActivity {
@Override
public boolean onPreferenceClick(Preference preference) {
if (!FeedManager.getInstance().getFeeds().isEmpty()) {
if (FeedManager.getInstance().getFeedsSize() > 0) {
new OpmlExportWorker(PreferenceActivity.this)
.executeAsync();
}

View File

@ -1,41 +1,39 @@
package de.danoeh.antennapod.adapter;
import java.util.List;
import android.content.Context;
import android.widget.ArrayAdapter;
import de.danoeh.antennapod.PodcastApp;
import android.widget.BaseAdapter;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.util.EpisodeFilter;
public abstract class AbstractFeedItemlistAdapter extends
ArrayAdapter<FeedItem> {
public abstract class AbstractFeedItemlistAdapter extends BaseAdapter {
private List<FeedItem> objects;
ItemAccess itemAccess;
public AbstractFeedItemlistAdapter(Context context, int textViewResourceId,
List<FeedItem> objects) {
super(context, textViewResourceId, objects);
this.objects = objects;
public AbstractFeedItemlistAdapter(ItemAccess itemAccess) {
super();
if (itemAccess == null) {
throw new IllegalArgumentException("itemAccess must not be null");
}
this.itemAccess = itemAccess;
}
@Override
public int getCount() {
if (UserPreferences.isDisplayOnlyEpisodes()) {
return EpisodeFilter.countItemsWithEpisodes(objects);
} else {
return super.getCount();
}
return itemAccess.getCount();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public FeedItem getItem(int position) {
if (UserPreferences.isDisplayOnlyEpisodes()) {
return EpisodeFilter.accessEpisodeByIndex(objects, position);
} else {
return super.getItem(position);
}
return itemAccess.getItem(position);
}
public static interface ItemAccess {
int getCount();
FeedItem getItem(int position);
}
}

View File

@ -1,39 +1,40 @@
package de.danoeh.antennapod.adapter;
import java.text.DateFormat;
import java.util.List;
import android.content.Context;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.DownloadStatus;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedFile;
import de.danoeh.antennapod.feed.FeedImage;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.util.DownloadError;
/** Displays a list of DownloadStatus entries. */
public class DownloadLogAdapter extends ArrayAdapter<DownloadStatus> {
public class DownloadLogAdapter extends BaseAdapter {
public DownloadLogAdapter(Context context, int textViewResourceId,
List<DownloadStatus> objects) {
super(context, textViewResourceId, objects);
private Context context;
private FeedManager manager = FeedManager.getInstance();
public DownloadLogAdapter(Context context) {
super();
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
DownloadStatus status = getItem(position);
FeedFile feedfile = status.getFeedFile();
if (convertView == null) {
holder = new Holder();
LayoutInflater inflater = (LayoutInflater) getContext()
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.downloadlog_item, null);
holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
@ -71,7 +72,7 @@ public class DownloadLogAdapter extends ArrayAdapter<DownloadStatus> {
holder.successful.setTextColor(convertView.getResources().getColor(
R.color.download_failed_red));
holder.successful.setText(R.string.download_failed);
String reasonText = DownloadError.getErrorString(getContext(),
String reasonText = DownloadError.getErrorString(context,
status.getReason());
if (status.getReasonDetailed() != null) {
reasonText += ": " + status.getReasonDetailed();
@ -91,4 +92,19 @@ public class DownloadLogAdapter extends ArrayAdapter<DownloadStatus> {
TextView reason;
}
@Override
public int getCount() {
return manager.getDownloadLogSize();
}
@Override
public DownloadStatus getItem(int position) {
return manager.getDownloadStatusFromLogAtIndex(position);
}
@Override
public long getItemId(int position) {
return position;
}
}

View File

@ -23,16 +23,20 @@ import de.danoeh.antennapod.util.Converter;
import de.danoeh.antennapod.util.ThemeUtils;
public class FeedItemlistAdapter extends AbstractFeedItemlistAdapter {
private Context context;
private ActionButtonCallback callback;
private boolean showFeedtitle;
private int selectedItemIndex;
public static final int SELECTION_NONE = -1;
public FeedItemlistAdapter(Context context, int textViewResourceId,
List<FeedItem> objects, ActionButtonCallback callback,
boolean showFeedtitle) {
super(context, textViewResourceId, objects);
public FeedItemlistAdapter(Context context,
AbstractFeedItemlistAdapter.ItemAccess itemAccess,
ActionButtonCallback callback, boolean showFeedtitle) {
super(itemAccess);
this.context = context;
this.callback = callback;
this.showFeedtitle = showFeedtitle;
this.selectedItemIndex = SELECTION_NONE;
@ -45,7 +49,7 @@ public class FeedItemlistAdapter extends AbstractFeedItemlistAdapter {
if (convertView == null) {
holder = new Holder();
LayoutInflater inflater = (LayoutInflater) getContext()
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.feeditemlist_item, null);
holder.title = (TextView) convertView
@ -160,7 +164,7 @@ public class FeedItemlistAdapter extends AbstractFeedItemlistAdapter {
holder.downloading.setVisibility(View.GONE);
}
TypedArray typeDrawables = getContext().obtainStyledAttributes(
TypedArray typeDrawables = context.obtainStyledAttributes(
new int[] { R.attr.type_audio, R.attr.type_video });
MediaType mediaType = item.getMedia().getMediaType();
if (mediaType == MediaType.AUDIO) {

View File

@ -9,24 +9,29 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.FeedImageLoader;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.ThemeUtils;
public class FeedlistAdapter extends ArrayAdapter<Feed> {
public class FeedlistAdapter extends BaseAdapter {
private static final String TAG = "FeedlistAdapter";
private Context context;
private FeedManager manager = FeedManager.getInstance();
private int selectedItemIndex;
private FeedImageLoader imageLoader;
public static final int SELECTION_NONE = -1;
public FeedlistAdapter(Context context, int textViewResourceId,
List<Feed> objects) {
super(context, textViewResourceId, objects);
public FeedlistAdapter(Context context) {
super();
this.context = context;
selectedItemIndex = SELECTION_NONE;
imageLoader = FeedImageLoader.getInstance();
}
@ -39,7 +44,7 @@ public class FeedlistAdapter extends ArrayAdapter<Feed> {
// Inflate Layout
if (convertView == null) {
holder = new Holder();
LayoutInflater inflater = (LayoutInflater) getContext()
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.feedlist_item, null);
@ -83,7 +88,7 @@ public class FeedlistAdapter extends ArrayAdapter<Feed> {
.getTime(), System.currentTimeMillis(),
DateFormat.MEDIUM, DateFormat.SHORT));
}
holder.numberOfEpisodes.setText(feed.getNumOfItems()
holder.numberOfEpisodes.setText(feed.getNumOfItems(true)
+ convertView.getResources()
.getString(R.string.episodes_suffix));
@ -136,4 +141,19 @@ public class FeedlistAdapter extends ArrayAdapter<Feed> {
notifyDataSetChanged();
}
@Override
public int getCount() {
return manager.getFeedsSize();
}
@Override
public Feed getItem(int position) {
return manager.getFeedAtIndex(position);
}
@Override
public long getItemId(int position) {
return position;
}
}

View File

@ -3,6 +3,7 @@ package de.danoeh.antennapod.asynctask;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
@ -50,7 +51,7 @@ public class OpmlExportWorker extends AsyncTask<Void, Void, Void> {
}
try {
FileWriter writer = new FileWriter(output);
opmlWriter.writeDocument(FeedManager.getInstance().getFeeds(),
opmlWriter.writeDocument(Arrays.asList(FeedManager.getInstance().getFeedsArray()),
writer);
writer.close();
} catch (IOException e) {

View File

@ -1,13 +1,16 @@
package de.danoeh.antennapod.feed;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import android.content.SyncResult;
import android.preference.PreferenceManager;
import de.danoeh.antennapod.PodcastApp;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.util.EpisodeFilter;
/**
* Data Object for a whole feed
@ -40,7 +43,7 @@ public class Feed extends FeedFile {
public Feed(Date lastUpdate) {
super();
items = new CopyOnWriteArrayList<FeedItem>();
items = Collections.synchronizedList(new ArrayList<FeedItem>());
this.lastUpdate = lastUpdate;
}
@ -71,7 +74,8 @@ public class Feed extends FeedFile {
int count = 0;
for (FeedItem item : items) {
if (item.getState() == FeedItem.State.NEW) {
if (!UserPreferences.isDisplayOnlyEpisodes() || item.getMedia() != null) {
if (!UserPreferences.isDisplayOnlyEpisodes()
|| item.getMedia() != null) {
count++;
}
}
@ -97,14 +101,18 @@ public class Feed extends FeedFile {
}
/**
* Returns true if at least one item in the itemlist is unread.If the
* 'display only episodes' - preference is set to true, this method will
* only count items with episodes.
* Returns true if at least one item in the itemlist is unread.
*
* @param enableEpisodeFilter
* true if this method should only count items with episodes if
* the 'display only episodes' - preference is set to true by the
* user.
*/
public boolean hasNewItems() {
public boolean hasNewItems(boolean enableEpisodeFilter) {
for (FeedItem item : items) {
if (item.getState() == FeedItem.State.NEW) {
if (!UserPreferences.isDisplayOnlyEpisodes() || item.getMedia() != null) {
if (!(enableEpisodeFilter && UserPreferences
.isDisplayOnlyEpisodes()) || item.getMedia() != null) {
return true;
}
}
@ -113,18 +121,34 @@ public class Feed extends FeedFile {
}
/**
* Returns the number of FeedItems. If the 'display only episodes' -
* preference is set to true, this method will only count items with
* episodes.
* Returns the number of FeedItems.
*
* @param enableEpisodeFilter
* true if this method should only count items with episodes if
* the 'display only episodes' - preference is set to true by the
* user.
* */
public int getNumOfItems() {
int count = 0;
for (FeedItem item : items) {
if (!UserPreferences.isDisplayOnlyEpisodes() || item.getMedia() != null) {
count++;
public int getNumOfItems(boolean enableEpisodeFilter) {
if (enableEpisodeFilter && UserPreferences.isDisplayOnlyEpisodes()) {
return EpisodeFilter.countItemsWithEpisodes(items);
} else {
return items.size();
}
}
return count;
/**
* Returns the item at the specified index.
*
* @param enableEpisodeFilter
* true if this method should ignore items without episdodes if
* the episodes filter has been enabled by the user.
*/
public FeedItem getItemAtIndex(boolean enableEpisodeFilter, int position) {
if (enableEpisodeFilter && UserPreferences.isDisplayOnlyEpisodes()) {
return EpisodeFilter.accessEpisodeByIndex(items, position);
} else {
return items.get(position);
}
}
/**
@ -264,12 +288,17 @@ public class Feed extends FeedFile {
this.image = image;
}
public List<FeedItem> getItems() {
List<FeedItem> getItems() {
return items;
}
public void setItems(ArrayList<FeedItem> items) {
this.items = items;
this.items = Collections.synchronizedList(items);
}
/** Returns an array that contains all the feeditems of this feed. */
public FeedItem[] getItemsArray() {
return items.toArray(new FeedItem[items.size()]);
}
public Date getLastUpdate() {

View File

@ -19,7 +19,6 @@ import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.PodcastApp;
import de.danoeh.antennapod.asynctask.DownloadStatus;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.service.PlaybackService;
@ -1472,7 +1471,22 @@ public class FeedManager {
});
}
public List<Feed> getFeeds() {
/** Returns the number of feeds that are currently in the feeds list. */
public int getFeedsSize() {
return feeds.size();
}
/** Returns the feed at the specified index of the feeds list. */
public Feed getFeedAtIndex(int index) {
return feeds.get(index);
}
/** Returns an array that contains all feeds of the feed manager. */
public Feed[] getFeedsArray() {
return feeds.toArray(new Feed[feeds.size()]);
}
List<Feed> getFeeds() {
return feeds;
}
@ -1542,12 +1556,31 @@ public class FeedManager {
}
}
public ArrayList<DownloadStatus> getDownloadLog() {
return downloadLog;
/**
* Returns the number of items in the playback history.
* */
public int getPlaybackHistorySize() {
return playbackHistory.size();
}
public List<FeedItem> getPlaybackHistory() {
return playbackHistory;
/**
* Returns the FeedItem at the specified index of the playback history.
*
* @throws IndexOutOfBoundsException
* if index is out of range
* */
public FeedItem getPlaybackHistoryItemIndex(int index) {
return playbackHistory.get(index);
}
/** Returns the number of items in the download log */
public int getDownloadLogSize() {
return downloadLog.size();
}
/** Returns the download status at the specified index of the download log. */
public DownloadStatus getDownloadStatusFromLogAtIndex(int index) {
return downloadLog.get(index);
}
/** Is called by a FeedManagerTask after completion. */

View File

@ -45,7 +45,6 @@ public class FeedlistFragment extends SherlockFragment implements
private FeedManager manager;
private FeedlistAdapter fla;
private SherlockFragmentActivity pActivity;
private Feed selectedFeed;
private ActionMode mActionMode;
@ -57,13 +56,11 @@ public class FeedlistFragment extends SherlockFragment implements
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
pActivity = (SherlockFragmentActivity) activity;
}
@Override
public void onDetach() {
super.onDetach();
pActivity = null;
}
@Override
@ -72,7 +69,7 @@ public class FeedlistFragment extends SherlockFragment implements
if (AppConfig.DEBUG)
Log.d(TAG, "Creating");
manager = FeedManager.getInstance();
fla = new FeedlistAdapter(pActivity, 0, manager.getFeeds());
fla = new FeedlistAdapter(getActivity());
}
@ -118,14 +115,14 @@ public class FeedlistFragment extends SherlockFragment implements
filter.addAction(FeedManager.ACTION_UNREAD_ITEMS_UPDATE);
filter.addAction(FeedManager.ACTION_FEED_LIST_UPDATE);
filter.addAction(DownloadService.ACTION_DOWNLOAD_HANDLED);
pActivity.registerReceiver(contentUpdate, filter);
getActivity().registerReceiver(contentUpdate, filter);
fla.notifyDataSetChanged();
}
@Override
public void onPause() {
super.onPause();
pActivity.unregisterReceiver(contentUpdate);
getActivity().unregisterReceiver(contentUpdate);
if (mActionMode != null) {
mActionMode.finish();
}
@ -211,10 +208,10 @@ public class FeedlistFragment extends SherlockFragment implements
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
Feed selection = fla.getItem(position);
Intent showFeed = new Intent(pActivity, FeedItemlistActivity.class);
Intent showFeed = new Intent(getActivity(), FeedItemlistActivity.class);
showFeed.putExtra(EXTRA_SELECTED_FEED, selection.getId());
pActivity.startActivity(showFeed);
getActivity().startActivity(showFeed);
}
@Override

View File

@ -2,6 +2,7 @@ package de.danoeh.antennapod.fragment;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@ -34,22 +35,19 @@ import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
/** Displays a list of FeedItems. */
@SuppressLint("ValidFragment")
public class ItemlistFragment extends SherlockListFragment {
private static final String TAG = "ItemlistFragment";
public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem";
public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id";
protected AbstractFeedItemlistAdapter fila;
protected FeedManager manager;
protected DownloadRequester requester;
protected FeedManager manager = FeedManager.getInstance();
protected DownloadRequester requester = DownloadRequester.getInstance();
/** The feed which the activity displays */
protected List<FeedItem> items;
/**
* This is only not null if the fragment displays the items of a specific
* feed
*/
protected Feed feed;
private AbstractFeedItemlistAdapter.ItemAccess itemAccess;
private Feed feed;
protected FeedItem selectedItem = null;
protected boolean contextMenuClosed = true;
@ -57,12 +55,10 @@ public class ItemlistFragment extends SherlockListFragment {
/** Argument for FeeditemlistAdapter */
protected boolean showFeedtitle;
public ItemlistFragment(List<FeedItem> items, boolean showFeedtitle) {
public ItemlistFragment(AbstractFeedItemlistAdapter.ItemAccess itemAccess, boolean showFeedtitle) {
super();
this.items = items;
this.itemAccess = itemAccess;
this.showFeedtitle = showFeedtitle;
manager = FeedManager.getInstance();
requester = DownloadRequester.getInstance();
}
public ItemlistFragment() {
@ -94,15 +90,27 @@ public class ItemlistFragment extends SherlockListFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (items == null) {
if (itemAccess == null) {
long feedId = getArguments().getLong(ARGUMENT_FEED_ID);
feed = FeedManager.getInstance().getFeed(feedId);
items = feed.getItems();
final Feed feed = FeedManager.getInstance().getFeed(feedId);
this.feed = feed;
itemAccess = new AbstractFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return feed.getItemAtIndex(true, position);
}
@Override
public int getCount() {
return feed.getNumOfItems(true);
}
};
}
}
protected AbstractFeedItemlistAdapter createListAdapter() {
return new FeedItemlistAdapter(getActivity(), 0, items,
return new FeedItemlistAdapter(getActivity(), itemAccess,
adapterCallback, showFeedtitle);
}
@ -178,7 +186,7 @@ public class ItemlistFragment extends SherlockListFragment {
getSherlockActivity()
.setSupportProgressBarIndeterminateVisibility(false);
}
getSherlockActivity().invalidateOptionsMenu();
getSherlockActivity().supportInvalidateOptionsMenu();
}
}

View File

@ -7,13 +7,27 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.adapter.AbstractFeedItemlistAdapter;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
public class PlaybackHistoryFragment extends ItemlistFragment {
private static final String TAG = "PlaybackHistoryFragment";
public PlaybackHistoryFragment() {
super(FeedManager.getInstance().getPlaybackHistory(), true);
super(new AbstractFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return FeedManager.getInstance().getPlaybackHistoryItemIndex(
position);
}
@Override
public int getCount() {
return FeedManager.getInstance().getPlaybackHistorySize();
}
}, true);
}
@Override

View File

@ -45,7 +45,7 @@ public class UserPreferences implements
private boolean pauseOnHeadsetDisconnect;
private boolean followQueue;
private boolean downloadMediaOnWifiOnly;
private int updateInterval;
private long updateInterval;
private boolean allowMobileUpdate;
private boolean autoQueue;
private boolean displayOnlyEpisodes;
@ -55,10 +55,6 @@ public class UserPreferences implements
private UserPreferences(Context context) {
this.context = context;
loadPreferences();
createImportDirectory();
createNoMediaFile();
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(this);
}
/**
@ -73,6 +69,11 @@ public class UserPreferences implements
if (context == null)
throw new IllegalArgumentException("Context must not be null");
instance = new UserPreferences(context);
createImportDirectory();
createNoMediaFile();
PreferenceManager.getDefaultSharedPreferences(context)
.registerOnSharedPreferenceChangeListener(instance);
}
private void loadPreferences() {
@ -83,7 +84,8 @@ public class UserPreferences implements
followQueue = sp.getBoolean(PREF_FOLLOW_QUEUE, false);
downloadMediaOnWifiOnly = sp.getBoolean(
PREF_DOWNLOAD_MEDIA_ON_WIFI_ONLY, true);
updateInterval = sp.getInt(PREF_UPDATE_INTERVAL, 0);
updateInterval = readUpdateInterval(sp.getString(PREF_UPDATE_INTERVAL,
"0"));
allowMobileUpdate = sp.getBoolean(PREF_MOBILE_UPDATE, false);
autoQueue = sp.getBoolean(PREF_AUTO_QUEUE, true);
displayOnlyEpisodes = sp.getBoolean(PREF_DISPLAY_ONLY_EPISODES, false);
@ -102,6 +104,11 @@ public class UserPreferences implements
}
}
private long readUpdateInterval(String valueFromPrefs) {
int hours = Integer.parseInt(valueFromPrefs);
return TimeUnit.HOURS.toMillis(hours);
}
private static void instanceAvailable() {
if (instance == null) {
throw new IllegalStateException(
@ -124,7 +131,7 @@ public class UserPreferences implements
return instance.downloadMediaOnWifiOnly;
}
public static int getUpdateInterval() {
public static long getUpdateInterval() {
instanceAvailable();
return instance.updateInterval;
}
@ -170,18 +177,16 @@ public class UserPreferences implements
followQueue = sp.getBoolean(PREF_FOLLOW_QUEUE, false);
} else if (key.equals(PREF_UPDATE_INTERVAL)) {
updateInterval = sp.getInt(PREF_UPDATE_INTERVAL, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
int hours = Integer.parseInt(sp
.getString(PREF_UPDATE_INTERVAL, "0"));
updateInterval = readUpdateInterval(sp.getString(
PREF_UPDATE_INTERVAL, "0"));
PendingIntent updateIntent = PendingIntent.getBroadcast(context, 0,
new Intent(FeedUpdateReceiver.ACTION_REFRESH_FEEDS), 0);
alarmManager.cancel(updateIntent);
if (hours != 0) {
long newIntervall = TimeUnit.HOURS.toMillis(hours);
if (updateInterval != 0) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
newIntervall, newIntervall, updateIntent);
updateInterval, updateInterval, updateIntent);
if (AppConfig.DEBUG)
Log.d(TAG, "Changed alarm to new intervall");
} else {

View File

@ -755,7 +755,7 @@ public class DownloadService extends Service {
}
private boolean hasValidFeedItems(Feed feed) {
for (FeedItem item : feed.getItems()) {
for (FeedItem item : feed.getItemsArray()) {
if (item.getTitle() == null) {
Log.e(TAG, "Item has no title");
return false;

View File

@ -334,7 +334,7 @@ public class PodDBAdapter {
public void setCompleteFeed(Feed feed) {
db.beginTransaction();
setFeed(feed);
for (FeedItem item : feed.getItems()) {
for (FeedItem item : feed.getItemsArray()) {
setFeedItem(item);
}
db.setTransactionSuccessful();
@ -485,7 +485,7 @@ public class PodDBAdapter {
if (feed.getImage() != null) {
removeFeedImage(feed.getImage());
}
for (FeedItem item : feed.getItems()) {
for (FeedItem item : feed.getItemsArray()) {
removeFeedItem(item);
}
db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",

View File

@ -1,6 +1,8 @@
package de.danoeh.antennapod.syndication.handler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
import de.danoeh.antennapod.feed.Feed;
@ -8,11 +10,15 @@ import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.syndication.namespace.Namespace;
import de.danoeh.antennapod.syndication.namespace.SyndElement;
/** Contains all relevant information to describe the current state of a SyndHandler.*/
/**
* Contains all relevant information to describe the current state of a
* SyndHandler.
*/
public class HandlerState {
/** Feed that the Handler is currently processing. */
protected Feed feed;
protected ArrayList<FeedItem> items;
protected FeedItem currentItem;
protected Stack<SyndElement> tagstack;
/** Namespaces that have been defined so far. */
@ -23,33 +29,39 @@ public class HandlerState {
public HandlerState(Feed feed) {
this.feed = feed;
items = new ArrayList<FeedItem>();
tagstack = new Stack<SyndElement>();
namespaces = new HashMap<String, Namespace>();
defaultNamespaces = new Stack<Namespace>();
}
public Feed getFeed() {
return feed;
}
public ArrayList<FeedItem> getItems() {
return items;
}
public FeedItem getCurrentItem() {
return currentItem;
}
public Stack<SyndElement> getTagstack() {
return tagstack;
}
public void setFeed(Feed feed) {
this.feed = feed;
}
public void setCurrentItem(FeedItem currentItem) {
this.currentItem = currentItem;
}
/** Returns the SyndElement that comes after the top element of the tagstack. */
/**
* Returns the SyndElement that comes after the top element of the tagstack.
*/
public SyndElement getSecondTag() {
SyndElement top = tagstack.pop();
SyndElement second = tagstack.peek();
@ -70,8 +82,4 @@ public class HandlerState {
return contentBuf;
}
}

View File

@ -120,6 +120,12 @@ public class SyndHandler extends DefaultHandler {
return handler;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
state.getFeed().setItems(state.getItems());
}
public HandlerState getState() {
return state;
}

View File

@ -43,7 +43,7 @@ public class NSRSS20 extends Namespace {
Attributes attributes) {
if (localName.equals(ITEM)) {
state.setCurrentItem(new FeedItem());
state.getFeed().getItems().add(state.getCurrentItem());
state.getItems().add(state.getCurrentItem());
state.getCurrentItem().setFeed(state.getFeed());
} else if (localName.equals(ENCLOSURE)) {

View File

@ -55,7 +55,7 @@ public class NSAtom extends Namespace {
Attributes attributes) {
if (localName.equals(ENTRY)) {
state.setCurrentItem(new FeedItem());
state.getFeed().getItems().add(state.getCurrentItem());
state.getItems().add(state.getCurrentItem());
state.getCurrentItem().setFeed(state.getFeed());
} else if (localName.matches(isText)) {
String type = attributes.getValue(TEXT_TYPE);

View File

@ -33,7 +33,7 @@ public class FeedMenuHandler {
if (AppConfig.DEBUG)
Log.d(TAG, "Preparing options menu");
menu.findItem(R.id.mark_all_read_item).setVisible(
selectedFeed.hasNewItems());
selectedFeed.hasNewItems(true));
if (selectedFeed.getPaymentLink() != null) {
menu.findItem(R.id.support_item).setVisible(true);
}

View File

@ -93,10 +93,6 @@ public class FeedHandlerTest extends AndroidTestCase {
Log.e(TAG, "Feed has no title");
return false;
}
if (feed.getItems() == null) {
Log.e(TAG, "Feed has no items");
return false;
}
if (!hasValidFeedItems(feed)) {
Log.e(TAG, "Feed has invalid items");
return false;
@ -122,7 +118,7 @@ public class FeedHandlerTest extends AndroidTestCase {
}
private boolean hasValidFeedItems(Feed feed) {
for (FeedItem item : feed.getItems()) {
for (FeedItem item : feed.getItemsArray()) {
if (item.getTitle() == null) {
Log.e(TAG, "Item has no title");
return false;