Ported several classes from FeedManager to DB*-classes

This commit is contained in:
daniel oeh 2013-06-01 18:29:04 +02:00
parent b83656049d
commit 71a47c0a5b
21 changed files with 810 additions and 329 deletions

View File

@ -1,15 +1,20 @@
package de.danoeh.antennapod.activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import de.danoeh.antennapod.adapter.DownloadLogAdapter;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.service.download.DownloadStatus;
import de.danoeh.antennapod.storage.DBReader;
import java.util.List;
/**
* Displays completed and failed downloads in a list. The data comes from the
@ -18,18 +23,18 @@ import de.danoeh.antennapod.preferences.UserPreferences;
public class DownloadLogActivity extends SherlockListActivity {
private static final String TAG = "DownloadLogActivity";
DownloadLogAdapter dla;
FeedManager manager;
private List<DownloadStatus> downloadLog;
private DownloadLogAdapter dla;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
manager = FeedManager.getInstance();
dla = new DownloadLogAdapter(this);
dla = new DownloadLogAdapter(this, itemAccess);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setListAdapter(dla);
loadData();
}
@Override
@ -62,12 +67,48 @@ public class DownloadLogActivity extends SherlockListActivity {
return true;
}
private void loadData() {
AsyncTask<Void, Void, List<DownloadStatus>> loadTask = new AsyncTask<Void, Void, List<DownloadStatus>>() {
@Override
protected List<DownloadStatus> doInBackground(Void... voids) {
return DBReader.getDownloadLog(DownloadLogActivity.this);
}
@Override
protected void onPostExecute(List<DownloadStatus> downloadStatuses) {
super.onPostExecute(downloadStatuses);
if (downloadStatuses != null) {
downloadLog = downloadStatuses;
if (dla != null) {
dla.notifyDataSetChanged();
}
} else {
Log.e(TAG, "Could not load download log");
}
}
};
loadTask.execute();
}
private DownloadLogAdapter.ItemAccess itemAccess = new DownloadLogAdapter.ItemAccess() {
@Override
public int getCount() {
return (downloadLog != null) ? downloadLog.size() : 0;
}
@Override
public DownloadStatus getItem(int position) {
return (downloadLog != null) ? downloadLog.get(position) : null;
}
};
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((arg & EventDistributor.DOWNLOADLOG_UPDATE) != 0) {
dla.notifyDataSetChanged();
loadData();
}
}
};

View File

@ -1,5 +1,6 @@
package de.danoeh.antennapod.activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
@ -15,8 +16,8 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.LangUtils;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@ -42,47 +43,66 @@ public class FeedInfoActivity extends SherlockActivity {
setContentView(R.layout.feedinfo);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1);
FeedManager manager = FeedManager.getInstance();
feed = manager.getFeed(feedId);
if (feed != null) {
if (AppConfig.DEBUG)
Log.d(TAG, "Language is " + feed.getLanguage());
if (AppConfig.DEBUG)
Log.d(TAG, "Author is " + feed.getAuthor());
imgvCover = (ImageView) findViewById(R.id.imgvCover);
txtvTitle = (TextView) findViewById(R.id.txtvTitle);
txtvDescription = (TextView) findViewById(R.id.txtvDescription);
txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
imgvCover.post(new Runnable() {
AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>() {
@Override
public void run() {
ImageLoader.getInstance().loadThumbnailBitmap(
feed.getImage(), imgvCover);
@Override
protected Feed doInBackground(Long... params) {
return DBReader.getFeed(FeedInfoActivity.this, params[0]);
}
@Override
protected void onPostExecute(Feed result) {
super.onPostExecute(result);
if (result != null) {
feed = result;
if (feed != null) {
if (AppConfig.DEBUG)
Log.d(TAG, "Language is " + feed.getLanguage());
if (AppConfig.DEBUG)
Log.d(TAG, "Author is " + feed.getAuthor());
imgvCover = (ImageView) findViewById(R.id.imgvCover);
txtvTitle = (TextView) findViewById(R.id.txtvTitle);
txtvDescription = (TextView) findViewById(R.id.txtvDescription);
txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
imgvCover.post(new Runnable() {
@Override
public void run() {
ImageLoader.getInstance().loadThumbnailBitmap(
feed.getImage(), imgvCover);
}
});
txtvTitle.setText(feed.getTitle());
txtvDescription.setText(feed.getDescription());
if (feed.getAuthor() != null) {
txtvAuthor.setText(feed.getAuthor());
}
if (feed.getLanguage() != null) {
txtvLanguage.setText(LangUtils
.getLanguageString(feed.getLanguage()));
}
supportInvalidateOptionsMenu();
}
} else {
Log.e(TAG, "Activity was started with invalid arguments");
}
});
txtvTitle.setText(feed.getTitle());
txtvDescription.setText(feed.getDescription());
if (feed.getAuthor() != null) {
txtvAuthor.setText(feed.getAuthor());
}
if (feed.getLanguage() != null) {
txtvLanguage.setText(LangUtils.getLanguageString(feed
.getLanguage()));
}
} else {
Log.e(TAG, "Activity was started with invalid arguments");
}
};
loadTask.execute(feedId);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.feedinfo, menu);
return true;
if (feed != null) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.feedinfo, menu);
return true;
} else {
return false;
}
}
@Override
@ -105,7 +125,8 @@ public class FeedInfoActivity extends SherlockActivity {
return FeedMenuHandler.onOptionsItemClicked(this, item, feed);
} catch (DownloadRequestException e) {
e.printStackTrace();
DownloadRequestErrorDialogCreator.newRequestErrorDialog(this, e.getMessage());
DownloadRequestErrorDialogCreator.newRequestErrorDialog(this,
e.getMessage());
}
return super.onOptionsItemSelected(item);
}

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
@ -15,16 +16,17 @@ import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.FeedRemover;
import de.danoeh.antennapod.dialog.ConfirmationDialog;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.ExternalPlayerFragment;
import de.danoeh.antennapod.fragment.FeedlistFragment;
import de.danoeh.antennapod.fragment.ItemlistFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.StorageUtils;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@ -33,8 +35,6 @@ import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
public class FeedItemlistActivity extends SherlockFragmentActivity {
private static final String TAG = "FeedItemlistActivity";
private FeedManager manager;
/** The feed which the activity displays */
private Feed feed;
private ItemlistFragment filf;
@ -50,27 +50,52 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.feeditemlist_activity);
manager = FeedManager.getInstance();
long feedId = getIntent().getLongExtra(
FeedlistFragment.EXTRA_SELECTED_FEED, -1);
if (feedId == -1)
if (feedId == -1) {
Log.e(TAG, "Received invalid feed selection.");
feed = manager.getFeed(feedId);
setTitle(feed.getTitle());
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fT = fragmentManager.beginTransaction();
filf = ItemlistFragment.newInstance(feed.getId());
fT.replace(R.id.feeditemlistFragment, filf);
externalPlayerFragment = new ExternalPlayerFragment();
fT.replace(R.id.playerFragment, externalPlayerFragment);
fT.commit();
} else {
loadData(feedId);
}
}
private void loadData(long id) {
AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>() {
@Override
protected Feed doInBackground(Long... longs) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feed data in background");
return DBReader.getFeed(FeedItemlistActivity.this, longs[0]);
}
@Override
protected void onPostExecute(Feed result) {
super.onPostExecute(result);
if (result != null) {
if (AppConfig.DEBUG) Log.d(TAG, "Finished loading feed data");
feed = result;
setTitle(feed.getTitle());
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fT = fragmentManager.beginTransaction();
filf = ItemlistFragment.newInstance(feed.getId());
fT.replace(R.id.feeditemlistFragment, filf);
externalPlayerFragment = new ExternalPlayerFragment();
fT.replace(R.id.playerFragment, externalPlayerFragment);
fT.commit();
supportInvalidateOptionsMenu();
} else {
Log.e(TAG, "Error: Feed was null");
}
}
};
loadTask.execute(id);
}
@Override
protected void onResume() {
super.onResume();
@ -79,13 +104,17 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.action_search });
menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label)
.setIcon(drawables.getDrawable(0))
.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
return FeedMenuHandler
.onCreateOptionsMenu(new MenuInflater(this), menu);
}
if (feed != null) {
TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.action_search });
menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label)
.setIcon(drawables.getDrawable(0))
.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
return FeedMenuHandler
.onCreateOptionsMenu(new MenuInflater(this), menu);
} else {
return false;
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
@ -142,10 +171,14 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
@Override
public boolean onSearchRequested() {
Bundle bundle = new Bundle();
bundle.putLong(SearchActivity.EXTRA_FEED_ID, feed.getId());
startSearch(null, false, bundle, false);
return true;
if (feed != null) {
Bundle bundle = new Bundle();
bundle.putLong(SearchActivity.EXTRA_FEED_ID, feed.getId());
startSearch(null, false, bundle, false);
return true;
} else {
return false;
}
}
}

View File

@ -1,55 +1,56 @@
package de.danoeh.antennapod.activity;
import java.text.DateFormat;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.format.DateUtils;
import android.util.Log;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.FeedlistFragment;
import de.danoeh.antennapod.fragment.ItemDescriptionFragment;
import de.danoeh.antennapod.fragment.ItemlistFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.StorageUtils;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
import java.text.DateFormat;
/** Displays a single FeedItem and provides various actions */
public class ItemviewActivity extends SherlockFragmentActivity {
private static final String TAG = "ItemviewActivity";
private FeedManager manager;
private FeedItem item;
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED;
// Widgets
private TextView txtvTitle;
private TextView txtvPublished;
private FeedItem item;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
StorageUtils.checkStorageAvailability(this);
manager = FeedManager.getInstance();
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
getSupportActionBar().setDisplayShowTitleEnabled(false);
extractFeeditem();
populateUI();
EventDistributor.getInstance().register(contentUpdate);
long itemId = getIntent().getLongExtra(
ItemlistFragment.EXTRA_SELECTED_FEEDITEM, -1);
if (itemId == -1) {
Log.e(TAG, "Received invalid selection of either feeditem or feed.");
} else {
loadData(itemId);
}
}
@Override
@ -66,28 +67,38 @@ public class ItemviewActivity extends SherlockFragmentActivity {
Log.d(TAG, "Stopping Activity");
}
/** Extracts FeedItem object the activity is supposed to display */
private void extractFeeditem() {
long itemId = getIntent().getLongExtra(
ItemlistFragment.EXTRA_SELECTED_FEEDITEM, -1);
long feedId = getIntent().getLongExtra(
FeedlistFragment.EXTRA_SELECTED_FEED, -1);
if (itemId == -1 || feedId == -1) {
Log.e(TAG, "Received invalid selection of either feeditem or feed.");
}
Feed feed = manager.getFeed(feedId);
item = manager.getFeedItem(itemId, feed);
if (AppConfig.DEBUG)
Log.d(TAG, "Title of item is " + item.getTitle());
if (AppConfig.DEBUG)
Log.d(TAG, "Title of feed is " + item.getFeed().getTitle());
}
private void loadData(long itemId) {
AsyncTask<Long, Void, FeedItem> loadTask = new AsyncTask<Long, Void, FeedItem>() {
@Override
protected FeedItem doInBackground(Long... longs) {
return DBReader.getFeedItem(ItemviewActivity.this, longs[0]);
}
@Override
protected void onPostExecute(FeedItem feedItem) {
super.onPostExecute(feedItem);
if (feedItem != null && feedItem.getFeed() != null) {
item = feedItem;
populateUI();
supportInvalidateOptionsMenu();
} else {
if (feedItem == null) {
Log.e(TAG, "Error: FeedItem was null");
} else if (feedItem.getFeed() == null) {
Log.e(TAG, "Error: Feed was null");
}
}
}
};
loadTask.execute(itemId);
}
private void populateUI() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.feeditemview);
txtvTitle = (TextView) findViewById(R.id.txtvItemname);
txtvPublished = (TextView) findViewById(R.id.txtvPublished);
TextView txtvTitle = (TextView) findViewById(R.id.txtvItemname);
TextView txtvPublished = (TextView) findViewById(R.id.txtvPublished);
setTitle(item.getFeed().getTitle());
txtvPublished.setText(DateUtils.formatSameDayTime(item.getPubDate()
@ -106,9 +117,13 @@ public class ItemviewActivity extends SherlockFragmentActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.feeditem, menu);
return true;
if (item != null) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.feeditem, menu);
return true;
} else {
return false;
}
}
@Override
@ -143,4 +158,19 @@ public class ItemviewActivity extends SherlockFragmentActivity {
}, item, true);
}
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
if (item != null) {
loadData(item.getId());
}
}
}
};
}

View File

@ -21,7 +21,6 @@ import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.FlattrClickWorker;
import de.danoeh.antennapod.dialog.TimeDialog;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.service.PlaybackService;
import de.danoeh.antennapod.util.Converter;
@ -39,8 +38,6 @@ public abstract class MediaplayerActivity extends SherlockFragmentActivity
implements OnSeekBarChangeListener {
private static final String TAG = "MediaplayerActivity";
protected FeedManager manager;
protected PlaybackController controller;
protected TextView txtvPosition;
@ -149,7 +146,6 @@ public abstract class MediaplayerActivity extends SherlockFragmentActivity
StorageUtils.checkStorageAvailability(this);
orientation = getResources().getConfiguration().orientation;
manager = FeedManager.getInstance();
getWindow().setFormat(PixelFormat.TRANSPARENT);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

View File

@ -1,36 +1,41 @@
package de.danoeh.antennapod.activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.mobeta.android.dslv.DragSortListView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DBTasks;
import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.util.UndoBarController;
import java.util.List;
public class OrganizeQueueActivity extends SherlockListActivity implements
UndoBarController.UndoListener {
private static final String TAG = "OrganizeQueueActivity";
private static final int MENU_ID_ACCEPT = 2;
private List<FeedItem> queue;
private OrganizeAdapter adapter;
private UndoBarController undoBarController;
@ -45,13 +50,37 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
listView.setDropListener(dropListener);
listView.setRemoveListener(removeListener);
adapter = new OrganizeAdapter(this);
setListAdapter(adapter);
loadData();
undoBarController = new UndoBarController(findViewById(R.id.undobar),
this);
}
private void loadData() {
AsyncTask<Void, Void, List<FeedItem>> loadTask = new AsyncTask<Void, Void, List<FeedItem>>() {
@Override
protected List<FeedItem> doInBackground(Void... voids) {
return DBReader.getQueue(OrganizeQueueActivity.this);
}
@Override
protected void onPostExecute(List<FeedItem> feedItems) {
super.onPostExecute(feedItems);
if (feedItems != null) {
queue = feedItems;
if (adapter == null) {
adapter = new OrganizeAdapter(OrganizeQueueActivity.this);
setListAdapter(adapter);
}
adapter.notifyDataSetChanged();
} else {
Log.e(TAG, "Queue was null");
}
}
};
loadTask.execute();
}
@Override
protected void onPause() {
super.onPause();
@ -61,8 +90,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
protected void onStop() {
super.onStop();
FeedManager.getInstance().autodownloadUndownloadedItems(
getApplicationContext());
DBTasks.autodownloadUndownloadedItems(getApplicationContext());
}
@Override
@ -76,9 +104,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if (((EventDistributor.QUEUE_UPDATE | EventDistributor.FEED_LIST_UPDATE) & arg) != 0) {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
loadData();
}
}
};
@ -87,9 +113,9 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void drop(int from, int to) {
FeedManager manager = FeedManager.getInstance();
manager.moveQueueItem(OrganizeQueueActivity.this, from, to, false);
adapter.notifyDataSetChanged();
DBWriter.moveQueueItem(OrganizeQueueActivity.this, from, to, true);
//adapter.notifyDataSetChanged();
}
};
@ -97,9 +123,8 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void remove(int which) {
FeedManager manager = FeedManager.getInstance();
FeedItem item = (FeedItem) getListAdapter().getItem(which);
manager.removeQueueItem(OrganizeQueueActivity.this, item, false);
DBWriter.removeQueueItem(OrganizeQueueActivity.this, item.getId(), true);
undoBarController.showUndoBar(false,
getString(R.string.removed_from_queue), new UndoToken(item,
which));
@ -127,22 +152,18 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
public void onUndo(Parcelable token) {
// Perform the undo
UndoToken undoToken = (UndoToken) token;
FeedItem feedItem = undoToken.getFeedItem();
long itemId = undoToken.getFeedItemId();
int position = undoToken.getPosition();
FeedManager manager = FeedManager.getInstance();
manager.addQueueItemAt(OrganizeQueueActivity.this, feedItem, position,
false);
DBWriter.addQueueItemAt(OrganizeQueueActivity.this, itemId, position, false);
}
private static class OrganizeAdapter extends BaseAdapter {
private Context context;
private FeedManager manager = FeedManager.getInstance();
private OrganizeQueueActivity organizeQueueActivity;
public OrganizeAdapter(Context context) {
public OrganizeAdapter(OrganizeQueueActivity organizeQueueActivity) {
super();
this.context = context;
this.organizeQueueActivity = organizeQueueActivity;
}
@Override
@ -152,7 +173,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
if (convertView == null) {
holder = new Holder();
LayoutInflater inflater = (LayoutInflater) context
LayoutInflater inflater = (LayoutInflater) organizeQueueActivity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(
R.layout.organize_queue_listitem, null);
@ -189,13 +210,20 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public int getCount() {
int queueSize = manager.getQueueSize(true);
return queueSize;
if (organizeQueueActivity.queue != null) {
return organizeQueueActivity.queue.size();
} else {
return 0;
}
}
@Override
public FeedItem getItem(int position) {
return manager.getQueueItemAtIndex(position, true);
if (organizeQueueActivity.queue != null) {
return organizeQueueActivity.queue.get(position);
} else {
return null;
}
}
@Override
@ -211,7 +239,6 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
private int position;
public UndoToken(FeedItem item, int position) {
FeedManager manager = FeedManager.getInstance();
this.itemId = item.getId();
this.feedId = item.getFeed().getId();
this.position = position;
@ -243,9 +270,8 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
out.writeInt(position);
}
public FeedItem getFeedItem() {
FeedManager manager = FeedManager.getInstance();
return manager.getFeedItem(itemId, feedId);
public long getFeedItemId() {
return itemId;
}
public int getPosition() {

View File

@ -14,6 +14,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.PlaybackHistoryFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.storage.DBWriter;
public class PlaybackHistoryActivity extends SherlockFragmentActivity {
private static final String TAG = "PlaybackHistoryActivity";
@ -36,7 +37,7 @@ public class PlaybackHistoryActivity extends SherlockFragmentActivity {
startActivity(intent);
return true;
case R.id.clear_history_item:
FeedManager.getInstance().clearPlaybackHistory(this);
DBWriter.clearPlaybackHistory(this);
return true;
}
return super.onOptionsItemSelected(item);

View File

@ -10,7 +10,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedImage;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.download.DownloadStatus;
import de.danoeh.antennapod.util.DownloadError;
@ -19,10 +18,12 @@ import de.danoeh.antennapod.util.DownloadError;
public class DownloadLogAdapter extends BaseAdapter {
private Context context;
private FeedManager manager = FeedManager.getInstance();
public DownloadLogAdapter(Context context) {
private ItemAccess itemAccess;
public DownloadLogAdapter(Context context, ItemAccess itemAccess) {
super();
this.itemAccess = itemAccess;
this.context = context;
}
@ -92,12 +93,12 @@ public class DownloadLogAdapter extends BaseAdapter {
@Override
public int getCount() {
return manager.getDownloadLogSize();
return itemAccess.getCount();
}
@Override
public DownloadStatus getItem(int position) {
return manager.getDownloadStatusFromLogAtIndex(position);
return itemAccess.getItem(position);
}
@Override
@ -105,4 +106,9 @@ public class DownloadLogAdapter extends BaseAdapter {
return position;
}
public static interface ItemAccess {
public int getCount();
public DownloadStatus getItem(int position);
}
}

View File

@ -14,7 +14,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.Converter;
@ -30,17 +29,18 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
public static final int GROUP_POS_UNREAD = 1;
private Context context;
private FeedManager manager = FeedManager.getInstance();
private ItemAccess itemAccess;
private ActionButtonCallback feedItemActionCallback;
private OnGroupActionClicked groupActionCallback;
public ExternalEpisodesListAdapter(Context context,
ActionButtonCallback callback,
OnGroupActionClicked groupActionCallback) {
OnGroupActionClicked groupActionCallback,
ItemAccess itemAccess) {
super();
this.context = context;
this.itemAccess = itemAccess;
this.feedItemActionCallback = callback;
this.groupActionCallback = groupActionCallback;
}
@ -53,10 +53,10 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public FeedItem getChild(int groupPosition, int childPosition) {
if (groupPosition == GROUP_POS_QUEUE) {
return manager.getQueueItemAtIndex(childPosition, true);
return itemAccess.getQueueItemAt(childPosition);
} else if (groupPosition == GROUP_POS_UNREAD) {
return manager.getUnreadItemAtIndex(childPosition, true);
}
return itemAccess.getUnreadItemAt(childPosition);
}
return null;
}
@ -200,9 +200,9 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public int getChildrenCount(int groupPosition) {
if (groupPosition == GROUP_POS_QUEUE) {
return manager.getQueueSize(true);
return itemAccess.getQueueSize();
} else if (groupPosition == GROUP_POS_UNREAD) {
return manager.getUnreadItemsSize(true);
return itemAccess.getUnreadItemsSize();
}
return 0;
}
@ -210,7 +210,7 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public int getGroupCount() {
// Hide 'unread items' group if empty
if (manager.getUnreadItemsSize(true) > 0) {
if (itemAccess.getUnreadItemsSize() > 0) {
return 2;
} else {
return 1;
@ -264,8 +264,8 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public boolean isEmpty() {
return manager.getUnreadItemsSize(true) == 0
&& manager.getQueueSize(true) == 0;
return itemAccess.getUnreadItemsSize() == 0
&& itemAccess.getQueueSize() == 0;
}
@Override
@ -287,4 +287,11 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
public void onClick(long groupId);
}
public static interface ItemAccess {
public int getQueueSize();
public int getUnreadItemsSize();
public FeedItem getQueueItemAt(int position);
public FeedItem getUnreadItemAt(int position);
}
}

View File

@ -11,7 +11,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.ThemeUtils;
@ -19,15 +18,23 @@ public class FeedlistAdapter extends BaseAdapter {
private static final String TAG = "FeedlistAdapter";
private Context context;
private FeedManager manager = FeedManager.getInstance();
protected ItemAccess itemAccess;
private int selectedItemIndex;
private ImageLoader imageLoader;
public static final int SELECTION_NONE = -1;
public FeedlistAdapter(Context context) {
public FeedlistAdapter(Context context, ItemAccess itemAccess) {
super();
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
if (itemAccess == null) {
throw new IllegalArgumentException("itemAccess must not be null");
}
this.context = context;
this.itemAccess = itemAccess;
selectedItemIndex = SELECTION_NONE;
imageLoader = ImageLoader.getInstance();
}
@ -145,12 +152,12 @@ public class FeedlistAdapter extends BaseAdapter {
@Override
public int getCount() {
return manager.getFeedsSize();
return itemAccess.getCount();
}
@Override
public Feed getItem(int position) {
return manager.getFeedAtIndex(position);
return itemAccess.getItem(position);
}
@Override
@ -158,4 +165,9 @@ public class FeedlistAdapter extends BaseAdapter {
return position;
}
public interface ItemAccess {
int getCount();
Feed getItem(int position);
}
}

View File

@ -14,13 +14,14 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.feed.MediaType;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.Converter;
import de.danoeh.antennapod.util.ThemeUtils;
import java.util.Iterator;
/** List adapter for items of feeds that the user has already subscribed to. */
public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
@ -31,7 +32,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
public static final int SELECTION_NONE = -1;
public InternalFeedItemlistAdapter(Context context,
DefaultFeedItemlistAdapter.ItemAccess itemAccess,
ItemAccess itemAccess,
ActionButtonCallback callback, boolean showFeedtitle) {
super(context, itemAccess);
this.callback = callback;
@ -155,7 +156,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
holder.lenSize.setVisibility(View.VISIBLE);
if (FeedManager.getInstance().isInQueue(item)) {
if (isInQueue(item)) {
holder.inPlaylist.setVisibility(View.VISIBLE);
} else {
holder.inPlaylist.setVisibility(View.GONE);
@ -204,6 +205,19 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
private boolean isInQueue(FeedItem item) {
Iterator<FeedItem> iter = ((ItemAccess) itemAccess).queueIterator();
if (iter != null) {
while (iter.hasNext()) {
FeedItem current = iter.next();
if (current.getId() == item.getId()) {
return true;
}
}
}
return false;
}
static class Holder extends DefaultFeedItemlistAdapter.Holder {
TextView feedtitle;
ImageView inPlaylist;
@ -224,4 +238,8 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
notifyDataSetChanged();
}
public static interface ItemAccess extends DefaultFeedItemlistAdapter.ItemAccess {
public Iterator<FeedItem> queueIterator();
}
}

View File

@ -7,7 +7,9 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DBWriter;
import java.util.concurrent.ExecutionException;
/** Removes a feed in the background. */
public class FeedRemover extends AsyncTask<Void, Void, Void> {
@ -23,9 +25,14 @@ public class FeedRemover extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
FeedManager manager = FeedManager.getInstance();
manager.deleteFeed(context, feed);
return null;
try {
DBWriter.deleteFeed(context, feed.getId()).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}
@Override

View File

@ -1448,7 +1448,7 @@ public class FeedManager {
long imageIndex = feedlistCursor
.getLong(PodDBAdapter.KEY_IMAGE_INDEX);
if (imageIndex != 0) {
// feed.setImage(DBReader.getFeedImage(adapter, imageIndex));
feed.setImage(DBReader.getFeedImage(adapter, imageIndex));
feed.getImage().setFeed(feed);
}
feed.file_url = feedlistCursor

View File

@ -1,6 +1,8 @@
package de.danoeh.antennapod.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
@ -25,9 +27,14 @@ import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DBTasks;
import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
import java.util.List;
public class EpisodesFragment extends SherlockFragment {
private static final String TAG = "EpisodesFragment";
@ -40,6 +47,9 @@ public class EpisodesFragment extends SherlockFragment {
private ExpandableListView listView;
private ExternalEpisodesListAdapter adapter;
private List<FeedItem> queue;
private List<FeedItem> unreadItems;
protected FeedItem selectedItem = null;
protected long selectedGroupId = -1;
protected boolean contextMenuClosed = true;
@ -92,7 +102,7 @@ public class EpisodesFragment extends SherlockFragment {
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
adapter = new ExternalEpisodesListAdapter(getActivity(),
adapterCallback, groupActionCallback);
adapterCallback, groupActionCallback, itemAccess);
listView.setAdapter(adapter);
listView.expandGroup(ExternalEpisodesListAdapter.GROUP_POS_QUEUE);
listView.expandGroup(ExternalEpisodesListAdapter.GROUP_POS_UNREAD);
@ -117,9 +127,73 @@ public class EpisodesFragment extends SherlockFragment {
return true;
}
});
loadData();
registerForContextMenu(listView);
}
ExternalEpisodesListAdapter.ItemAccess itemAccess = new ExternalEpisodesListAdapter.ItemAccess() {
@Override
public int getQueueSize() {
return (queue != null) ? queue.size() : 0;
}
@Override
public int getUnreadItemsSize() {
return (unreadItems != null) ? unreadItems.size() : 0;
}
@Override
public FeedItem getQueueItemAt(int position) {
return (queue != null) ? queue.get(position) : null;
}
@Override
public FeedItem getUnreadItemAt(int position) {
return (unreadItems != null) ? unreadItems.get(position) : null;
}
};
private void loadData() {
AsyncTask<Void, Void, Void> loadTask = new AsyncTask<Void, Void, Void>() {
private volatile List<FeedItem> queueRef;
private volatile List<FeedItem> unreadItemsRef;
@Override
protected Void doInBackground(Void... voids) {
if (AppConfig.DEBUG) Log.d(TAG, "Starting to load list data");
Context context = EpisodesFragment.this.getActivity();
if (context != null) {
queueRef = DBReader.getQueue(context);
unreadItemsRef = DBReader.getUnreadItemsList(context);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (queueRef != null && unreadItemsRef != null) {
if (AppConfig.DEBUG) Log.d(TAG, "Done loading list data");
queue = queueRef;
unreadItems = unreadItemsRef;
if (adapter != null) {
adapter.notifyDataSetChanged();
}
} else {
if (queueRef == null) {
Log.e(TAG, "Could not load queue");
}
if (unreadItemsRef == null) {
Log.e(TAG, "Could not load unread items");
}
}
}
};
loadTask.execute();
}
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
@ -127,7 +201,7 @@ public class EpisodesFragment extends SherlockFragment {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
adapter.notifyDataSetChanged();
loadData();
}
}
};
@ -172,7 +246,6 @@ public class EpisodesFragment extends SherlockFragment {
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
boolean handled = false;
FeedManager manager = FeedManager.getInstance();
if (selectedItem != null) {
try {
handled = FeedItemMenuHandler.onMenuItemClicked(
@ -191,10 +264,10 @@ public class EpisodesFragment extends SherlockFragment {
OrganizeQueueActivity.class));
break;
case R.id.clear_queue_item:
manager.clearQueue(getActivity());
DBWriter.clearQueue(getActivity());
break;
case R.id.download_all_item:
manager.downloadAllItemsInQueue(getActivity());
DBTasks.downloadAllItemsInQueue(getActivity());
break;
default:
handled = false;
@ -203,10 +276,10 @@ public class EpisodesFragment extends SherlockFragment {
handled = true;
switch (item.getItemId()) {
case R.id.mark_all_read_item:
manager.markAllItemsRead(getActivity());
DBWriter.markAllItemsRead(getActivity());
break;
case R.id.enqueue_all_item:
manager.enqueueAllNewItems(getActivity());
DBTasks.enqueueAllNewItems(getActivity());
break;
default:
handled = false;

View File

@ -1,9 +1,11 @@
package de.danoeh.antennapod.fragment;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
@ -28,7 +30,7 @@ import de.danoeh.antennapod.dialog.ConfirmationDialog;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@ -41,11 +43,11 @@ public class FeedlistFragment extends SherlockFragment implements
| EventDistributor.DOWNLOAD_QUEUED
| EventDistributor.FEED_LIST_UPDATE
| EventDistributor.UNREAD_ITEMS_UPDATE;
public static final String EXTRA_SELECTED_FEED = "extra.de.danoeh.antennapod.activity.selected_feed";
private FeedManager manager;
private FeedlistAdapter fla;
private List<Feed> feeds;
private Feed selectedFeed;
private ActionMode mActionMode;
@ -54,24 +56,57 @@ public class FeedlistFragment extends SherlockFragment implements
private ListView listView;
private TextView txtvEmpty;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
private FeedlistAdapter.ItemAccess itemAccess = new FeedlistAdapter.ItemAccess() {
@Override
public void onDetach() {
super.onDetach();
}
@Override
public Feed getItem(int position) {
if (feeds != null) {
return feeds.get(position);
} else {
return null;
}
}
@Override
public int getCount() {
if (feeds != null) {
return feeds.size();
} else {
return 0;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (AppConfig.DEBUG)
Log.d(TAG, "Creating");
manager = FeedManager.getInstance();
fla = new FeedlistAdapter(getActivity());
fla = new FeedlistAdapter(getActivity(), itemAccess);
loadFeeds();
}
private void loadFeeds() {
AsyncTask<Void, Void, List<Feed>> loadTask = new AsyncTask<Void, Void, List<Feed>>() {
@Override
protected List<Feed> doInBackground(Void... params) {
return DBReader.getFeedList(getActivity());
}
@Override
protected void onPostExecute(List<Feed> result) {
super.onPostExecute(result);
if (result != null) {
feeds = result;
if (fla != null) {
fla.notifyDataSetChanged();
}
} else {
Log.e(TAG, "Failed to load feeds");
}
}
};
loadTask.execute();
}
@Override
@ -112,7 +147,6 @@ public class FeedlistFragment extends SherlockFragment implements
if (AppConfig.DEBUG)
Log.d(TAG, "Resuming");
EventDistributor.getInstance().register(contentUpdate);
fla.notifyDataSetChanged();
}
@Override
@ -125,13 +159,13 @@ public class FeedlistFragment extends SherlockFragment implements
}
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
fla.notifyDataSetChanged();
loadFeeds();
}
}
};
@ -154,7 +188,7 @@ public class FeedlistFragment extends SherlockFragment implements
try {
if (FeedMenuHandler.onOptionsItemClicked(getSherlockActivity(),
item, selectedFeed)) {
fla.notifyDataSetChanged();
loadFeeds();
} else {
switch (item.getItemId()) {
case R.id.remove_item:
@ -163,7 +197,7 @@ public class FeedlistFragment extends SherlockFragment implements
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
fla.notifyDataSetChanged();
loadFeeds();
}
};
ConfirmationDialog conDialog = new ConfirmationDialog(

View File

@ -1,7 +1,9 @@
package de.danoeh.antennapod.fragment;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
@ -18,18 +20,20 @@ import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.ItemviewActivity;
import de.danoeh.antennapod.adapter.ActionButtonCallback;
import de.danoeh.antennapod.adapter.DefaultFeedItemlistAdapter;
import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
import java.util.Iterator;
import java.util.List;
/** Displays a list of FeedItems. */
@SuppressLint("ValidFragment")
public class ItemlistFragment extends SherlockListFragment {
@ -43,12 +47,10 @@ public class ItemlistFragment extends SherlockListFragment {
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 InternalFeedItemlistAdapter fila;
protected FeedManager manager = FeedManager.getInstance();
protected DownloadRequester requester = DownloadRequester.getInstance();
private DefaultFeedItemlistAdapter.ItemAccess itemAccess;
private Feed feed;
protected List<FeedItem> queue;
protected FeedItem selectedItem = null;
protected boolean contextMenuClosed = true;
@ -56,10 +58,8 @@ public class ItemlistFragment extends SherlockListFragment {
/** Argument for FeeditemlistAdapter */
protected boolean showFeedtitle;
public ItemlistFragment(DefaultFeedItemlistAdapter.ItemAccess itemAccess,
boolean showFeedtitle) {
public ItemlistFragment(boolean showFeedtitle) {
super();
this.itemAccess = itemAccess;
this.showFeedtitle = showFeedtitle;
}
@ -83,6 +83,30 @@ public class ItemlistFragment extends SherlockListFragment {
return i;
}
private InternalFeedItemlistAdapter.ItemAccess itemAccessRef;
protected InternalFeedItemlistAdapter.ItemAccess itemAccess() {
if (itemAccessRef == null) {
itemAccessRef = new InternalFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return (feed != null) ? feed.getItemAtIndex(true, position) : null;
}
@Override
public int getCount() {
return (feed != null) ? feed.getNumOfItems(true) : 0;
}
@Override
public Iterator<FeedItem> queueIterator() {
return (queue != null) ? queue.iterator() : null;
}
};
}
return itemAccessRef;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@ -92,27 +116,60 @@ public class ItemlistFragment extends SherlockListFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (itemAccess == null) {
long feedId = getArguments().getLong(ARGUMENT_FEED_ID);
final Feed feed = FeedManager.getInstance().getFeed(feedId);
this.feed = feed;
itemAccess = new DefaultFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return feed.getItemAtIndex(true, position);
}
@Override
public int getCount() {
return feed.getNumOfItems(true);
}
};
}
loadData();
}
protected void loadData() {
final long feedId;
if (feed == null) {
feedId = getArguments().getLong(ARGUMENT_FEED_ID);
} else {
feedId = feed.getId();
}
AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>(){
private volatile List<FeedItem> queueRef;
@Override
protected Feed doInBackground(Long... longs) {
Context context = ItemlistFragment.this.getActivity();
if (context != null) {
Feed result = DBReader.getFeed(context, longs[0]);
if (result != null) {
result.setItems(DBReader.getFeedItemList(context, result));
queueRef = DBReader.getQueue(context);
return result;
}
}
return null;
}
@Override
protected void onPostExecute(Feed result) {
super.onPostExecute(result);
if (result != null && result.getItems() != null) {
feed = result;
if (queueRef != null) {
queue = queueRef;
} else {
Log.e(TAG, "Could not load queue");
}
if (fila != null) {
fila.notifyDataSetChanged();
}
} else {
if (result == null) {
Log.e(TAG, "Could not load feed with id " + feedId);
} else if (result.getItems() == null) {
Log.e(TAG, "Could not load feed items");
}
}
}
};
loadTask.execute(feedId);
}
protected InternalFeedItemlistAdapter createListAdapter() {
return new InternalFeedItemlistAdapter(getActivity(), itemAccess,
return new InternalFeedItemlistAdapter(getActivity(), itemAccess(),
adapterCallback, showFeedtitle);
}
@ -162,7 +219,9 @@ public class ItemlistFragment extends SherlockListFragment {
if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) {
updateProgressBarVisibility();
} else {
fila.notifyDataSetChanged();
if (feed != null) {
loadData();
}
updateProgressBarVisibility();
}
}

View File

@ -1,33 +1,53 @@
package de.danoeh.antennapod.fragment;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.adapter.DefaultFeedItemlistAdapter;
import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DBReader;
import java.util.Iterator;
import java.util.List;
public class PlaybackHistoryFragment extends ItemlistFragment {
private static final String TAG = "PlaybackHistoryFragment";
private List<FeedItem> playbackHistory;
public PlaybackHistoryFragment() {
super(new DefaultFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return FeedManager.getInstance().getPlaybackHistoryItemIndex(
position);
}
@Override
public int getCount() {
return FeedManager.getInstance().getPlaybackHistorySize();
}
}, true);
super(true);
}
@Override
InternalFeedItemlistAdapter.ItemAccess itemAccessRef;
@Override
protected InternalFeedItemlistAdapter.ItemAccess itemAccess() {
if (itemAccessRef == null) {
itemAccessRef = new InternalFeedItemlistAdapter.ItemAccess() {
@Override
public FeedItem getItem(int position) {
return (playbackHistory != null) ? playbackHistory.get(position) : null;
}
@Override
public int getCount() {
return (playbackHistory != null) ? playbackHistory.size() : 0;
}
@Override
public Iterator<FeedItem> queueIterator() {
return (queue != null) ? queue.iterator() : null;
}
};
}
return itemAccessRef;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventDistributor.getInstance().register(historyUpdate);
@ -46,10 +66,48 @@ public class PlaybackHistoryFragment extends ItemlistFragment {
if ((EventDistributor.PLAYBACK_HISTORY_UPDATE & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received content update");
fila.notifyDataSetChanged();
loadData();
}
}
};
@Override
protected void loadData() {
AsyncTask<Void, Void, Void> loadTask = new AsyncTask<Void, Void, Void>() {
private volatile List<FeedItem> phRef;
private volatile List<FeedItem> queueRef;
@Override
protected Void doInBackground(Void... voids) {
Context context = PlaybackHistoryFragment.this.getActivity();
if (context != null) {
queueRef = DBReader.getQueue(context);
phRef = DBReader.getPlaybackHistory(context);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (queueRef != null && phRef != null) {
queue = queueRef;
playbackHistory = phRef;
Log.i(TAG, "Number of items in playback history: " + playbackHistory.size());
if (fila != null) {
fila.notifyDataSetChanged();
}
} else {
if (queueRef == null) {
Log.e(TAG, "Could not load queue");
}
if (phRef == null) {
Log.e(TAG, "Could not load playback history");
}
}
}
};
loadTask.execute();
}
}

View File

@ -78,6 +78,9 @@ public final class DBReader {
break;
}
}
if (item.getFeed() == null) {
Log.w(TAG, "No match found for item with ID " + item.getId() + ". Feed ID was " + item.getFeedId());
}
}
}
@ -107,7 +110,7 @@ public final class DBReader {
private static List<FeedItem> extractItemlistFromCursor(
PodDBAdapter adapter, Cursor itemlistCursor) {
ArrayList<String> mediaIds = new ArrayList<String>();
ArrayList<String> itemIds = new ArrayList<String>();
List<FeedItem> items = new ArrayList<FeedItem>(
itemlistCursor.getCount());
@ -126,12 +129,8 @@ public final class DBReader {
.getString(PodDBAdapter.IDX_FI_SMALL_PAYMENT_LINK));
item.setFeedId(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_FEED));
long mediaId = itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_MEDIA);
if (mediaId != 0) {
mediaIds.add(String.valueOf(mediaId));
item.setMedia(new FeedMedia(mediaId, item));
}
itemIds.add(String.valueOf(item.getId()));
item.setRead((itemlistCursor
.getInt(PodDBAdapter.IDX_FI_SMALL_READ) > 0) ? true
: false);
@ -182,23 +181,23 @@ public final class DBReader {
} while (itemlistCursor.moveToNext());
}
extractMediafromItemlist(adapter, items, mediaIds);
extractMediafromItemlist(adapter, items, itemIds);
Collections.sort(items, new FeedItemPubdateComparator());
return items;
}
private static void extractMediafromItemlist(PodDBAdapter adapter,
List<FeedItem> items, ArrayList<String> mediaIds) {
List<FeedItem> items, ArrayList<String> itemIds) {
List<FeedItem> itemsCopy = new ArrayList<FeedItem>(items);
Cursor cursor = adapter.getFeedMediaCursor(mediaIds
.toArray(new String[mediaIds.size()]));
Cursor cursor = adapter.getFeedMediaCursor(itemIds
.toArray(new String[itemIds.size()]));
if (cursor.moveToFirst()) {
do {
long mediaId = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
long itemId = cursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX);
// find matching feed item
FeedItem item = getMatchingItemForMedia(mediaId, itemsCopy);
itemsCopy.remove(item);
FeedItem item = getMatchingItemForMedia(itemId, itemsCopy);
if (item != null) {
Date playbackCompletionDate = null;
long playbackCompletionTime = cursor
@ -257,10 +256,10 @@ public final class DBReader {
return feed;
}
private static FeedItem getMatchingItemForMedia(long mediaId,
private static FeedItem getMatchingItemForMedia(long itemId,
List<FeedItem> items) {
for (FeedItem item : items) {
if (item.getMedia() != null && item.getMedia().getId() == mediaId) {
if (item.getId() == itemId) {
return item;
}
}
@ -355,12 +354,13 @@ public final class DBReader {
Cursor mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
String[] itemIds = new String[mediaCursor.getCount()];
for (int i = 0; i < itemIds.length; i++) {
itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_FEEDITEM_INDEX));
for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) {
itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX));
}
mediaCursor.close();
Cursor itemCursor = adapter.getFeedItemCursor(itemIds);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
loadFeedDataOfFeedItemlist(context, items);
itemCursor.close();
adapter.close();
@ -417,7 +417,9 @@ public final class DBReader {
if (feedCursor.moveToFirst()) {
feed = extractFeedFromCursorRow(adapter, feedCursor);
feed.setItems(getFeedItemList(context, feed));
}
} else {
Log.e(TAG, "getFeed could not find feed with id " + feedId);
}
adapter.close();
return feed;
}
@ -432,6 +434,7 @@ public final class DBReader {
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
if (list.size() > 0) {
item = list.get(0);
loadFeedDataOfFeedItemlist(context, list);
}
}
return item;
@ -465,7 +468,7 @@ public final class DBReader {
* The id of the object
* @return The found object
* */
private static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
public static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
Cursor cursor = adapter.getImageOfFeedCursor(id);
if ((cursor.getCount() == 0) || !cursor.moveToFirst()) {
throw new SQLException("No FeedImage found at index: " + id);

View File

@ -5,6 +5,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import android.content.Context;
@ -88,8 +89,8 @@ public class DBWriter {
});
}
public static void deleteFeed(final Context context, final long feedId) {
dbExec.submit(new Runnable() {
public static Future<?> deleteFeed(final Context context, final long feedId) {
return dbExec.submit(new Runnable() {
@Override
public void run() {
DownloadRequester requester = DownloadRequester.getInstance();
@ -378,7 +379,7 @@ public class DBWriter {
}
public void moveQueueItem(final Context context, final int from,
public static void moveQueueItem(final Context context, final int from,
final int to, final boolean broadcastUpdate) {
dbExec.submit(new Runnable() {

View File

@ -86,7 +86,7 @@ public class DownloadRequester {
"Requesting download of url " + item.getDownload_url());
item.setDownload_url(URLChecker.prepareURL(item.getDownload_url()));
DownloadRequest request = new DownloadRequest(item.getFile_url(),
DownloadRequest request = new DownloadRequest(dest.toString(),
item.getDownload_url(), item.getHumanReadableIdentifier(),
item.getId(), item.getTypeAsInt());

View File

@ -22,12 +22,14 @@ import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.download.DownloadStatus;
// TODO Remove media column from feeditem table
/**
* Implements methods for accessing the database
* */
public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
private static final int DATABASE_VERSION = 8;
private static final int DATABASE_VERSION = 9;
private static final String DATABASE_NAME = "Antennapod.db";
/** Maximum number of arguments for IN-operator. */
@ -64,6 +66,7 @@ public class PodDBAdapter {
public static final int KEY_SIZE_INDEX = 6;
public static final int KEY_MIME_TYPE_INDEX = 7;
public static final int KEY_PLAYBACK_COMPLETION_DATE_INDEX = 8;
public static final int KEY_MEDIA_FEEDITEM_INDEX = 9;
// --------- Download log indices
public static final int KEY_FEEDFILE_INDEX = 1;
public static final int KEY_FEEDFILETYPE_INDEX = 2;
@ -160,7 +163,8 @@ public class PodDBAdapter {
+ " INTEGER," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL
+ " TEXT," + KEY_DOWNLOADED + " INTEGER," + KEY_POSITION
+ " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT,"
+ KEY_PLAYBACK_COMPLETION_DATE + " INTEGER)";
+ KEY_PLAYBACK_COMPLETION_DATE + " INTEGER,"
+ KEY_FEEDITEM + " INTEGER)";
private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE "
+ TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE
@ -186,9 +190,16 @@ public class PodDBAdapter {
* Select all columns from the feeditems-table except description and
* content-encoded.
*/
private static final String[] SEL_FI_SMALL = { KEY_ID, KEY_TITLE,
KEY_PUBDATE, KEY_READ, KEY_LINK, KEY_PAYMENT_LINK, KEY_MEDIA,
KEY_FEED, KEY_HAS_CHAPTERS, KEY_ITEM_IDENTIFIER };
private static final String[] SEL_FI_SMALL = {
TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
TABLE_NAME_FEED_ITEMS + "." + KEY_TITLE,
TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE,
TABLE_NAME_FEED_ITEMS + "." + KEY_READ,
TABLE_NAME_FEED_ITEMS + "." + KEY_LINK,
TABLE_NAME_FEED_ITEMS + "." + KEY_PAYMENT_LINK, KEY_MEDIA,
TABLE_NAME_FEED_ITEMS + "." + KEY_FEED,
TABLE_NAME_FEED_ITEMS + "." + KEY_HAS_CHAPTERS,
TABLE_NAME_FEED_ITEMS + "." + KEY_ITEM_IDENTIFIER };
// column indices for SEL_FI_SMALL
@ -214,9 +225,18 @@ public class PodDBAdapter {
public static final int IDX_FI_EXTRA_CONTENT_ENCODED = 2;
public static final int IDX_FI_EXTRA_FEED = 3;
static PodDBHelper dbHelperSingleton;
private static synchronized PodDBHelper getDbHelperSingleton(Context appContext) {
if (dbHelperSingleton == null) {
dbHelperSingleton = new PodDBHelper(appContext, DATABASE_NAME, null, DATABASE_VERSION);
}
return dbHelperSingleton;
}
public PodDBAdapter(Context c) {
this.context = c;
helper = new PodDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
helper = getDbHelperSingleton(c.getApplicationContext());
}
public PodDBAdapter open() {
@ -236,7 +256,7 @@ public class PodDBAdapter {
public void close() {
if (AppConfig.DEBUG)
Log.d(TAG, "Closing DB");
db.close();
//db.close();
}
/**
@ -319,6 +339,9 @@ public class PodDBAdapter {
} else {
values.put(KEY_PLAYBACK_COMPLETION_DATE, 0);
}
if (media.getItem() != null) {
values.put(KEY_FEEDITEM, media.getItem().getId());
}
if (media.getId() == 0) {
media.setId(db.insert(TABLE_NAME_FEED_MEDIA, null, values));
} else {
@ -376,12 +399,6 @@ public class PodDBAdapter {
}
values.put(KEY_PUBDATE, item.getPubDate().getTime());
values.put(KEY_PAYMENT_LINK, item.getPaymentLink());
if (item.getMedia() != null) {
if (item.getMedia().getId() == 0) {
setMedia(item.getMedia());
}
values.put(KEY_MEDIA, item.getMedia().getId());
}
if (item.getFeed().getId() == 0) {
setFeed(item.getFeed());
}
@ -395,6 +412,11 @@ public class PodDBAdapter {
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?",
new String[] { String.valueOf(item.getId()) });
}
if (item.getMedia() != null) {
if (item.getMedia().getId() == 0) {
setMedia(item.getMedia());
}
}
if (item.getChapters() != null) {
setChapters(item);
}
@ -662,11 +684,22 @@ public class PodDBAdapter {
*/
public final Cursor getQueueCursor() {
open();
Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL,
"INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE,
TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM }, null, null,
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM);
String selFiSmall = Arrays.toString(SEL_FI_SMALL);
Object[] args = (Object[]) new String[] {
selFiSmall.substring(1, selFiSmall.length() - 1),
TABLE_NAME_FEED_ITEMS, TABLE_NAME_QUEUE,
TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM,
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM };
String query = String.format(
"SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args);
Cursor c = db.rawQuery(query, null);
/*
* Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL,
* "INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE,
* TABLE_NAME_FEED_ITEMS + "." + KEY_ID, TABLE_NAME_QUEUE + "." +
* KEY_FEEDITEM }, null, null, TABLE_NAME_QUEUE + "." + KEY_FEEDITEM);
*/
return c;
}
@ -715,7 +748,7 @@ public class PodDBAdapter {
throw new IllegalArgumentException("Limit must be >= 0");
}
open();
Cursor c = db.query(CREATE_TABLE_FEED_MEDIA, null,
Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null,
KEY_PLAYBACK_COMPLETION_DATE + " IS NOT NULL", null, null,
null, KEY_PLAYBACK_COMPLETION_DATE + " DESC LIMIT " + limit);
return c;
@ -746,12 +779,12 @@ public class PodDBAdapter {
}
cursors[i] = db.rawQuery("SELECT * FROM "
+ TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_ID + " IN "
+ TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_FEEDITEM + " IN "
+ buildInOperator(neededLength), parts);
}
return new MergeCursor(cursors);
} else {
return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN "
return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_FEEDITEM + " IN "
+ buildInOperator(length), mediaIds, null, null, null);
}
}
@ -781,7 +814,7 @@ public class PodDBAdapter {
}
open();
return db.query(TABLE_NAME_FEED_ITEMS, null, KEY_ID + " IN "
return db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL, KEY_ID + " IN "
+ buildInOperator(ids.length), ids, null, null, null);
}
@ -883,43 +916,65 @@ public class PodDBAdapter {
db.execSQL(CREATE_TABLE_SIMPLECHAPTERS);
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
final int newVersion) {
Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
+ newVersion + ".");
if (oldVersion <= 1) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ KEY_TYPE + " TEXT");
}
if (oldVersion <= 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ " ADD COLUMN " + KEY_LINK + " TEXT");
}
if (oldVersion <= 3) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + KEY_ITEM_IDENTIFIER + " TEXT");
}
if (oldVersion <= 4) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ KEY_FEED_IDENTIFIER + " TEXT");
}
if (oldVersion <= 5) {
db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ " ADD COLUMN " + KEY_REASON_DETAILED + " TEXT");
db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ " ADD COLUMN " + KEY_DOWNLOADSTATUS_TITLE + " TEXT");
}
if (oldVersion <= 6) {
db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ " ADD COLUMN " + KEY_CHAPTER_TYPE + " INTEGER");
}
if (oldVersion <= 7) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ " ADD COLUMN " + KEY_PLAYBACK_COMPLETION_DATE
+ " INTEGER");
}
}
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
final int newVersion) {
Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
+ newVersion + ".");
if (oldVersion <= 1) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ KEY_TYPE + " TEXT");
}
if (oldVersion <= 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ " ADD COLUMN " + KEY_LINK + " TEXT");
}
if (oldVersion <= 3) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + KEY_ITEM_IDENTIFIER + " TEXT");
}
if (oldVersion <= 4) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ KEY_FEED_IDENTIFIER + " TEXT");
}
if (oldVersion <= 5) {
db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ " ADD COLUMN " + KEY_REASON_DETAILED + " TEXT");
db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ " ADD COLUMN " + KEY_DOWNLOADSTATUS_TITLE + " TEXT");
}
if (oldVersion <= 6) {
db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ " ADD COLUMN " + KEY_CHAPTER_TYPE + " INTEGER");
}
if (oldVersion <= 7) {
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ " ADD COLUMN " + KEY_PLAYBACK_COMPLETION_DATE
+ " INTEGER");
}
if (oldVersion <= 8) {
final int KEY_ID_POSITION = 0;
final int KEY_MEDIA_POSITION = 1;
// Add feeditem column to feedmedia table
db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ " ADD COLUMN " + KEY_FEEDITEM
+ " INTEGER");
Cursor feeditemCursor = db.query(TABLE_NAME_FEED_ITEMS, new String[]{KEY_ID, KEY_MEDIA}, "? > 0", new String[] {KEY_MEDIA}, null, null, null);
if (feeditemCursor.moveToFirst()) {
db.beginTransaction();
ContentValues contentValues = new ContentValues();
do {
long mediaId = feeditemCursor.getLong(KEY_MEDIA_POSITION);
contentValues.put(KEY_FEEDITEM, feeditemCursor.getLong(KEY_ID_POSITION));
db.update(TABLE_NAME_FEED_MEDIA, contentValues, "?=?", new String[] {KEY_ID, Long.toString(mediaId)});
contentValues.clear();
} while (feeditemCursor.moveToNext());
db.setTransactionSuccessful();
db.endTransaction();
}
feeditemCursor.close();
}
}
}
}