summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2014-06-08 13:57:32 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2014-06-08 13:57:32 +0200
commitd9a610fb61028845349d98c4e1574778a7cfc05e (patch)
tree0103ceec7eef54c940ad80d12f90c5c975dda602
parentc3e0ac9e74ef012c08eef0348604c2fdefca8074 (diff)
downloadAntennaPod-d9a610fb61028845349d98c4e1574778a7cfc05e.zip
Show queue size and number of unread items in navdrawer. closes #453
-rw-r--r--res/layout/nav_listitem.xml20
-rw-r--r--src/de/danoeh/antennapod/activity/AudioplayerActivity.java34
-rw-r--r--src/de/danoeh/antennapod/activity/MainActivity.java49
-rw-r--r--src/de/danoeh/antennapod/adapter/NavListAdapter.java17
-rw-r--r--src/de/danoeh/antennapod/storage/DBReader.java48
-rw-r--r--src/de/danoeh/antennapod/storage/PodDBAdapter.java12
-rw-r--r--src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java40
7 files changed, 180 insertions, 40 deletions
diff --git a/res/layout/nav_listitem.xml b/res/layout/nav_listitem.xml
index 585ee7528..3691026a1 100644
--- a/res/layout/nav_listitem.xml
+++ b/res/layout/nav_listitem.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<ImageView
android:id="@+id/imgvCover"
@@ -35,4 +35,18 @@
android:layout_marginRight="48dp"
android:layout_toRightOf="@id/imgvCover"
/>
+
+ <TextView
+ android:id="@+id/txtvCount"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:lines="1"
+ android:textColor="?android:attr/textColorTertiary"
+ android:textSize="@dimen/text_size_navdrawer"
+ android:layout_marginLeft="12dp"
+ android:layout_marginTop="14dp"
+ android:layout_marginBottom="14dp"
+ android:layout_marginRight="16dp"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"/>
</RelativeLayout> \ No newline at end of file
diff --git a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
index 2ffaae967..090c3f1f5 100644
--- a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
+++ b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
@@ -34,8 +34,6 @@ import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.util.playback.ExternalMedia;
import de.danoeh.antennapod.util.playback.Playable;
-import java.util.List;
-
/**
* Activity for playing audio files.
*/
@@ -624,20 +622,20 @@ public class AudioplayerActivity extends MediaplayerActivity {
}
}
- private List<Feed> feeds;
- private AsyncTask<Void, Void, List<Feed>> loadTask;
+ private DBReader.NavDrawerData navDrawerData;
+ private AsyncTask<Void, Void, DBReader.NavDrawerData> loadTask;
private void loadData() {
- loadTask = new AsyncTask<Void, Void, List<Feed>>() {
+ loadTask = new AsyncTask<Void, Void, DBReader.NavDrawerData>() {
@Override
- protected List<Feed> doInBackground(Void... params) {
- return DBReader.getFeedList(AudioplayerActivity.this);
+ protected DBReader.NavDrawerData doInBackground(Void... params) {
+ return DBReader.getNavDrawerData(AudioplayerActivity.this);
}
@Override
- protected void onPostExecute(List<Feed> result) {
+ protected void onPostExecute(DBReader.NavDrawerData result) {
super.onPostExecute(result);
- feeds = result;
+ navDrawerData = result;
if (navAdapter != null) {
navAdapter.notifyDataSetChanged();
}
@@ -667,8 +665,8 @@ public class AudioplayerActivity extends MediaplayerActivity {
private final NavListAdapter.ItemAccess itemAccess = new NavListAdapter.ItemAccess() {
@Override
public int getCount() {
- if (feeds != null) {
- return feeds.size();
+ if (navDrawerData != null) {
+ return navDrawerData.feeds.size();
} else {
return 0;
}
@@ -676,8 +674,8 @@ public class AudioplayerActivity extends MediaplayerActivity {
@Override
public Feed getItem(int position) {
- if (feeds != null && position < feeds.size()) {
- return feeds.get(position);
+ if (navDrawerData != null && position < navDrawerData.feeds.size()) {
+ return navDrawerData.feeds.get(position);
} else {
return null;
}
@@ -687,5 +685,15 @@ public class AudioplayerActivity extends MediaplayerActivity {
public int getSelectedItemIndex() {
return -1;
}
+
+ @Override
+ public int getQueueSize() {
+ return (navDrawerData != null) ? navDrawerData.queueSize : 0;
+ }
+
+ @Override
+ public int getNumberOfUnreadItems() {
+ return (navDrawerData != null) ? navDrawerData.numUnreadItems : 0;
+ }
};
}
diff --git a/src/de/danoeh/antennapod/activity/MainActivity.java b/src/de/danoeh/antennapod/activity/MainActivity.java
index 898897bd8..257bea82d 100644
--- a/src/de/danoeh/antennapod/activity/MainActivity.java
+++ b/src/de/danoeh/antennapod/activity/MainActivity.java
@@ -39,7 +39,8 @@ public class MainActivity extends ActionBarActivity {
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED
| EventDistributor.DOWNLOAD_QUEUED
| EventDistributor.FEED_LIST_UPDATE
- | EventDistributor.UNREAD_ITEMS_UPDATE;
+ | EventDistributor.UNREAD_ITEMS_UPDATE
+ | EventDistributor.QUEUE_UPDATE;
public static final String PREF_NAME = "MainActivityPrefs";
public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch";
@@ -147,7 +148,7 @@ public class MainActivity extends ActionBarActivity {
}
public List<Feed> getFeeds() {
- return feeds;
+ return (navDrawerData != null) ? navDrawerData.feeds : null;
}
private void loadFragment(int viewType, int relPos, Bundle args) {
@@ -207,9 +208,9 @@ public class MainActivity extends ActionBarActivity {
}
public void loadFeedFragment(long feedID) {
- if (feeds != null) {
- for (int i = 0; i < feeds.size(); i++) {
- if (feeds.get(i).getId() == feedID) {
+ if (navDrawerData != null) {
+ for (int i = 0; i < navDrawerData.feeds.size(); i++) {
+ if (navDrawerData.feeds.get(i).getId() == feedID) {
loadFragment(NavListAdapter.VIEW_TYPE_SUBSCRIPTION, i, null);
break;
}
@@ -279,7 +280,7 @@ public class MainActivity extends ActionBarActivity {
EventDistributor.getInstance().register(contentUpdate);
Intent intent = getIntent();
- if (feeds != null && intent.hasExtra(EXTRA_NAV_INDEX) && intent.hasExtra(EXTRA_NAV_TYPE)) {
+ if (navDrawerData != null && intent.hasExtra(EXTRA_NAV_INDEX) && intent.hasExtra(EXTRA_NAV_TYPE)) {
handleNavIntent();
}
@@ -322,15 +323,15 @@ public class MainActivity extends ActionBarActivity {
return true;
}
- private List<Feed> feeds;
- private AsyncTask<Void, Void, List<Feed>> loadTask;
+ private DBReader.NavDrawerData navDrawerData;
+ private AsyncTask<Void, Void, DBReader.NavDrawerData> loadTask;
private int selectedNavListIndex = 0;
private NavListAdapter.ItemAccess itemAccess = new NavListAdapter.ItemAccess() {
@Override
public int getCount() {
- if (feeds != null) {
- return feeds.size();
+ if (navDrawerData != null) {
+ return navDrawerData.feeds.size();
} else {
return 0;
}
@@ -338,8 +339,8 @@ public class MainActivity extends ActionBarActivity {
@Override
public Feed getItem(int position) {
- if (feeds != null && position < feeds.size()) {
- return feeds.get(position);
+ if (navDrawerData != null && position < navDrawerData.feeds.size()) {
+ return navDrawerData.feeds.get(position);
} else {
return null;
}
@@ -350,23 +351,33 @@ public class MainActivity extends ActionBarActivity {
return selectedNavListIndex;
}
+ @Override
+ public int getQueueSize() {
+ return (navDrawerData != null) ? navDrawerData.queueSize : 0;
+ }
+
+ @Override
+ public int getNumberOfUnreadItems() {
+ return (navDrawerData != null) ? navDrawerData.numUnreadItems : 0;
+ }
+
};
private void loadData() {
cancelLoadTask();
- loadTask = new AsyncTask<Void, Void, List<Feed>>() {
+ loadTask = new AsyncTask<Void, Void, DBReader.NavDrawerData>() {
@Override
- protected List<Feed> doInBackground(Void... params) {
- return DBReader.getFeedList(MainActivity.this);
+ protected DBReader.NavDrawerData doInBackground(Void... params) {
+ return DBReader.getNavDrawerData(MainActivity.this);
}
@Override
- protected void onPostExecute(List<Feed> result) {
- super.onPostExecute(result);
- boolean handleIntent = (feeds == null);
+ protected void onPostExecute(DBReader.NavDrawerData result) {
+ super.onPostExecute(navDrawerData);
+ boolean handleIntent = (navDrawerData == null);
- feeds = result;
+ navDrawerData = result;
navAdapter.notifyDataSetChanged();
if (handleIntent) {
diff --git a/src/de/danoeh/antennapod/adapter/NavListAdapter.java b/src/de/danoeh/antennapod/adapter/NavListAdapter.java
index 928ec5dde..2e95a176b 100644
--- a/src/de/danoeh/antennapod/adapter/NavListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/NavListAdapter.java
@@ -113,6 +113,7 @@ public class NavListAdapter extends BaseAdapter {
convertView = inflater.inflate(R.layout.nav_listitem, null);
holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.count = (TextView) convertView.findViewById(R.id.txtvCount);
holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
convertView.setTag(holder);
} else {
@@ -120,6 +121,17 @@ public class NavListAdapter extends BaseAdapter {
}
holder.title.setText(title);
+
+ if (NAV_TITLES[position] == R.string.queue_label) {
+ holder.count.setVisibility(View.VISIBLE);
+ holder.count.setText(String.valueOf(itemAccess.getQueueSize()));
+ } else if (NAV_TITLES[position] == R.string.all_episodes_label) {
+ holder.count.setVisibility(View.VISIBLE);
+ holder.count.setText(String.valueOf(itemAccess.getNumberOfUnreadItems()));
+ } else {
+ holder.count.setVisibility(View.GONE);
+ }
+
holder.image.setImageDrawable(drawables[position]);
return convertView;
@@ -174,6 +186,7 @@ public class NavListAdapter extends BaseAdapter {
static class NavHolder {
TextView title;
+ TextView count;
ImageView image;
}
@@ -193,6 +206,10 @@ public class NavListAdapter extends BaseAdapter {
public Feed getItem(int position);
public int getSelectedItemIndex();
+
+ public int getQueueSize();
+
+ public int getNumberOfUnreadItems();
}
}
diff --git a/src/de/danoeh/antennapod/storage/DBReader.java b/src/de/danoeh/antennapod/storage/DBReader.java
index 4aeca7cd6..e49ea4f83 100644
--- a/src/de/danoeh/antennapod/storage/DBReader.java
+++ b/src/de/danoeh/antennapod/storage/DBReader.java
@@ -56,6 +56,14 @@ public final class DBReader {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
+ List<Feed> result = getFeedList(adapter);
+ adapter.close();
+ return result;
+ }
+
+ private static List<Feed> getFeedList(PodDBAdapter adapter) {
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "Extracting Feedlist");
Cursor feedlistCursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<Feed>(feedlistCursor.getCount());
@@ -509,8 +517,8 @@ public final class DBReader {
* Loads a list of FeedItems sorted by pubDate in descending order.
*
* @param context A context that is used for opening a database connection.
- * @param limit The maximum number of episodes that should be loaded.
- * */
+ * @param limit The maximum number of episodes that should be loaded.
+ */
public static List<FeedItem> getRecentlyPublishedEpisodes(Context context, int limit) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Extracting recently published items list");
@@ -596,7 +604,8 @@ public final class DBReader {
.getString(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE_INDEX);
Date completionDate = new Date(
logCursor
- .getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX));
+ .getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX)
+ );
downloadLog.add(new DownloadStatus(id, title, feedfileId,
feedfileType, successful, DownloadError.fromCode(reason), completionDate,
reasonDetailed));
@@ -787,7 +796,8 @@ public final class DBReader {
cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL)),
cursor.getInt(cursor
- .getColumnIndex(PodDBAdapter.KEY_DOWNLOADED)) > 0);
+ .getColumnIndex(PodDBAdapter.KEY_DOWNLOADED)) > 0
+ );
cursor.close();
return image;
}
@@ -865,4 +875,34 @@ public final class DBReader {
adapter.close();
return empty;
}
+
+ /**
+ * Returns data necessary for displaying the navigation drawer. This includes
+ * the list of subscriptions, the number of items in the queue and the number of unread
+ * items.
+ *
+ * @param context A context that is used for opening a database connection.
+ */
+ public static NavDrawerData getNavDrawerData(Context context) {
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ List<Feed> feeds = getFeedList(adapter);
+ int queueSize = adapter.getQueueSize();
+ int numUnreadItems = adapter.getNumberOfUnreadItems();
+ NavDrawerData result = new NavDrawerData(feeds, queueSize, numUnreadItems);
+ adapter.close();
+ return result;
+ }
+
+ public static class NavDrawerData {
+ public List<Feed> feeds;
+ public int queueSize;
+ public int numUnreadItems;
+
+ public NavDrawerData(List<Feed> feeds, int queueSize, int numUnreadItems) {
+ this.feeds = feeds;
+ this.queueSize = queueSize;
+ this.numUnreadItems = numUnreadItems;
+ }
+ }
}
diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
index 285709537..06c8b1fc9 100644
--- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java
+++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
@@ -1,6 +1,5 @@
package de.danoeh.antennapod.storage;
-import android.app.backup.BackupManager;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -1107,6 +1106,17 @@ public class PodDBAdapter {
}
+ public int getQueueSize() {
+ final String query = String.format("SELECT COUNT(%s) FROM %s", KEY_ID, TABLE_NAME_QUEUE);
+ Cursor c = db.rawQuery(query, null);
+ int result = 0;
+ if (c.moveToFirst()) {
+ result = c.getInt(0);
+ }
+ c.close();
+ return result;
+ }
+
public final int getNumberOfUnreadItems() {
final String query = "SELECT COUNT(DISTINCT " + KEY_ID + ") AS count FROM " + TABLE_NAME_FEED_ITEMS +
" WHERE " + KEY_READ + " = 0";
diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java
index cb854b88d..c42c7a0cc 100644
--- a/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java
+++ b/src/instrumentationTest/de/test/antennapod/storage/DBReaderTest.java
@@ -365,4 +365,44 @@ public class DBReaderTest extends InstrumentationTestCase {
assertEquals("Wrong entry at index " + i, feeds.get(i).getId(), statistics.get(i).getFeedID());
}
}
+
+ public void testGetNavDrawerDataQueueEmptyNoUnreadItems() {
+ final Context context = getInstrumentation().getTargetContext();
+ final int NUM_FEEDS = 10;
+ final int NUM_ITEMS = 10;
+ List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, true);
+ DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context);
+ assertEquals(NUM_FEEDS, navDrawerData.feeds.size());
+ assertEquals(0, navDrawerData.numUnreadItems);
+ assertEquals(0, navDrawerData.queueSize);
+ }
+
+ public void testGetNavDrawerDataQueueNotEmptyWithUnreadItems() {
+ final Context context = getInstrumentation().getTargetContext();
+ final int NUM_FEEDS = 10;
+ final int NUM_ITEMS = 10;
+ final int NUM_QUEUE = 1;
+ final int NUM_UNREAD = 2;
+ List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, true);
+ PodDBAdapter adapter = new PodDBAdapter(context);
+ adapter.open();
+ for (int i = 0; i < NUM_UNREAD; i++) {
+ FeedItem item = feeds.get(0).getItems().get(i);
+ item.setRead(false);
+ adapter.setSingleFeedItem(item);
+ }
+ List<FeedItem> queue = new ArrayList<FeedItem>();
+ for (int i = 0; i < NUM_QUEUE; i++) {
+ FeedItem item = feeds.get(1).getItems().get(i);
+ queue.add(item);
+ }
+ adapter.setQueue(queue);
+
+ adapter.close();
+
+ DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context);
+ assertEquals(NUM_FEEDS, navDrawerData.feeds.size());
+ assertEquals(NUM_UNREAD, navDrawerData.numUnreadItems);
+ assertEquals(NUM_QUEUE, navDrawerData.queueSize);
+ }
}