FeedViewer for Android

FeedViewer is an HTML viewer for Android devices, optimized for offline reading of RSS feeds such as news sites, blogs and science sites.

I wrote about what it's for and my motivation for developing it in: Android tablet as an ebook/RSS reader. To some extent, it's a replacement for Plucker on PalmOS.

This is my first Android app, so be gentle.

It's free and open source (licensed under the GNU Public License version 2 or, at your option, any later version).

The first source code is here: FeedViewer-2013-10-07.tar.gz or you can download the latest binary here: FeedViewer-2013-10-07.apk

New in 2013-10-07: finally, FeedViewer remembers its position in files you've already visited, and remembers it upon restart. Thanks to Dragan Stanojevi&cgrave; - Nevidljivi, who gave me the trick to scrolling Android WebViews after I had given up.

FeedViewer is not currently available in the Android marketplace or on any other Android sites, because I've never gotten around to registering and it doesn't seem like there would be enough interest to make it worthwhile.


To scroll down, tap in the lower left or right corner of the screen, or use the volume down button if you have one. To scroll up, tap in the top corners or use volume up. Of course, normal Android fling-scrolling also works.

Dragging along the far left edge of the screen will adjust the screen brightness. (It also scrolls at the same time; I haven't figured out a way to disable that scrolling, sorry.)

<< and >> go back and forward like a browser (flinging left and right also work). On Android 1.6 it was fairly inconsistent where you'll end up, but that seems to be a bug in Android's WebView; it seems much better in Android 2.3.

Feeds shows the overview of all the feeds you have available to read; ToC goes to the table of contents for the current feed.

The Scroll menu scrolls approximately to the top, 20%, 40%, 60%, 80% or bottom of the document. This isn't very accurate yet.

To adjust font size, use the menu button to make the font smaller or larger.

Where does it look for articles?

FeedViewer looks for directories named "feeds" on the android's storage and/or on its SD card.
I've only tested it on one device, my Archos 5 running Android 1.6. I think Archos may mount the filesystem in a nonstandard place. If you try FeedViewer and it can't see your feeds, let me know where your device mounts them and I'll add it to the search list.

Any directory inside "feeds" is taken to be a specific site and day, and FeedViewer will look for an index page named index.html inside that.

For instance, if feeds/12-19-Sun/ contains BBC_News_Science/, Slate/ and The_Register/, FeedViewer's top-level "Feeds" page will show something like:

/storage/feeds/12-19-Sun feeds:
12-19-Sun BBC_News_Science
12-19-Sun Slate
12-19-Sun The Register

Each of those individual feeds is a link, so click on the Slate line to read today's new Slate stories.

Typical use pattern

Here's how I use FeedViewer each day. Of course, you may invent other models.

  1. Plug in the Archos, click Mount and mount the device's SD card on my desktop machine as /androidsd.
  2. Run a script to collect any saved URLs from my FeedViewer reading, generate a fake RSS file from them so we'll get them in the next feedme run, and save a copy of the URLs to a file in case I ever want to go back and find them. You may want to do that a different way, but if you want my script, it's archosbak.
  3. Run feedme on my desktop machine to gather simplified HTML for the RSS feeds in my list. This creates a directory named something like ~/feeds/12-19-Sun. (The naming scheme varies, and that one depends on the latest feedme, which I haven't released yet but am about to.) In feedme.conf I set formats = none so it produces only HTML, no plucker or epub or other translations.
  4. cp -r ~/feeds/12-19-Sun /androidsd/
  5. Periodically remove old directories inside ~/feeds. Right now I do this manually (while I'm testing) but eventually will use an automated command like find ~/feeds -ctime +6 -exec rm "{}" \;

Once you're in the reader, Feeds goes to the index page, ToC goes to the index page for the current feed, the << and >> buttons go back and forward (horizontal swipes do that too), a long press at the bottom or top of the screen pages down or up (or you can scroll with vertical swipes).

Colors and Stylesheet

Android's WebView defaults to a white background and black text. They let you change the white background to something else, but you can't change the text color, so if you want light-on-dark default colors (like "Night mode" in Aldiko), you're out of luck.

But of course individual web pages can use any colors they want. So here's what I do: in FeedMe, when I download HTML pages, I add a stylesheet at the beginning of each page that looks like this:

<link rel="stylesheet" type="text/css" title="Feeds" href="../../feeds.css"/>

Then feeds.css contains something like this:

body { 
  color: white;
  background: #011;

a:link { color: #ffff00; }
a:visited { color: #aaffaa; }
a:hover, a:active { color: #ffffaa; }
Or to make them all the same color, something like
a:link, a:visited, a:hover, a:active { color: #ffff00 !important; }

These should probably have !important at the ends, since occasionally you hit portions of a page where the text reverts to black and you can't read it. But even !important doesn't seem to override that. I need to experiment more.

If you have trouble tapping on lines in the top-level feeds page because the lines are too close together, you can space them out like this:

/* Space out the feeds list page so there's space for a finger */
div.index { margin-top: 1em; margin-bottom: 1.2em; }

I found that in Android 1.6, I also needed to increase the size of preformatted/fixed-width text. In 2.3 I don't need that any more.

/* Android 1.6's default preformatted font is tiny */
tt, pre { font-size: 1.2em; }

Eventually I'll probably add controls to FeedViewer so you can change the colors interactively (by writing to feeds.css), but right now I'm the only user (as far as I know) so it hasn't been a priority.

Of course, you can add any additional CSS style you want, changing fonts or anything else.


Finally found a way go use single tap in corners for scrolling instead of longpress at top/bottom. Improve back/forward logic so you can go back even if the app starts on a second- or third-level page.
(Various unlogged tweaks through 2011 and early 2012)
Clean up some of the changes from the last release; greatly improve the brightness control's sensitivity.
Revert the goBack() change from yesterday: turns out WebView's canGoBack() is broken for generated pages (reports that it can when it really can't).
Launcher icons; set timer to guard against false clicks; better error handling; better handing of saved preferences; lots of other improvements.
Lots of improvements.
First public upload; basic functionality works.

More Software
Shallowsky Home
mail me