summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md3
-rw-r--r--app/src/main/AndroidManifest.xml4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java42
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java13
-rw-r--r--app/src/main/java/de/danoeh/antennapod/config/StorageCallbacksImpl.java40
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java26
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java7
-rw-r--r--app/src/main/res/layout/cover_fragment.xml4
-rw-r--r--app/src/main/res/layout/feedinfo.xml14
-rw-r--r--app/src/main/res/menu/allepisodes_context.xml27
-rw-r--r--app/src/main/res/menu/feedinfo.xml2
-rw-r--r--app/src/main/res/menu/feeditem_options.xml29
-rw-r--r--app/src/main/res/menu/feeditemlist_context.xml28
-rw-r--r--app/src/main/res/menu/feedlist.xml23
-rw-r--r--app/src/main/res/menu/mediaplayer.xml35
-rw-r--r--app/src/main/res/menu/queue_context.xml29
-rw-r--r--core/src/androidTest/java/de/danoeh/antennapod/core/tests/util/DateUtilsTest.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/event/ProgressEvent.java36
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java15
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java15
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java47
-rw-r--r--core/src/main/res/values/strings.xml124
30 files changed, 486 insertions, 129 deletions
diff --git a/README.md b/README.md
index 9b6ba3000..c4d4870e8 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,9 @@ You can use the [AntennaPod Google Group](https://groups.google.com/forum/#!foru
Bug reports and feature requests can be submitted [here](https://github.com/danieloeh/AntennaPod/issues/new) (please read the [instructions](https://github.com/danieloeh/AntennaPod/blob/master/CONTRIBUTING.md) on how to report a bug and how to submit a feature request first!).
+## Beta Testing
+You can participate in beta testing by joining the Google Plus [AntennaPod Beta](https://plus.google.com/communities/105484485757508984859) community.
+
## Alpha Testing
You can participate in alpha testing by joining the Google Plus [AntennaPod Alpha](https://plus.google.com/communities/117446128636140585144) community.
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 363561f5a..f5989cd08 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.danoeh.antennapod"
- android:versionCode="58"
- android:versionName="1.2.1">
+ android:versionCode="59"
+ android:versionName="1.3 alpha">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
index 254749cd6..5b80b8f9d 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.activity;
import android.app.AlertDialog;
+import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -31,6 +32,7 @@ import java.util.List;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.NavListAdapter;
+import de.danoeh.antennapod.core.event.ProgressEvent;
import de.danoeh.antennapod.core.feed.EventDistributor;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.QueueEvent;
@@ -92,8 +94,10 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
private ActionBarDrawerToggle drawerToggle;
- private CharSequence drawerTitle;
private CharSequence currentTitle;
+ private String currentFragment;
+
+ private ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -107,7 +111,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
setSupportActionBar(toolbar);
getSupportActionBar().setElevation(3.0f);
- drawerTitle = currentTitle = getTitle();
+ currentTitle = getTitle();
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
navList = (ListView) findViewById(R.id.nav_list);
@@ -173,6 +177,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
}
private void saveLastNavFragment(String tag) {
+ Log.d(TAG, "saveLastNavFragment(tag: " + tag +")");
SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
if(tag != null) {
@@ -180,12 +185,15 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
} else {
edit.remove(PREF_LAST_FRAGMENT_TAG);
}
+ currentFragment = tag;
edit.commit();
}
private String getLastNavFragment() {
SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
- return prefs.getString(PREF_LAST_FRAGMENT_TAG, QueueFragment.TAG);
+ String lastFragment = prefs.getString(PREF_LAST_FRAGMENT_TAG, QueueFragment.TAG);
+ Log.d(TAG, "getLastNavFragment() -> " + lastFragment);
+ return lastFragment;
}
private void checkFirstLaunch() {
@@ -251,6 +259,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
}
public void loadFragment(int index, Bundle args) {
+ Log.d(TAG, "loadFragment(index: " + index + ", args: " + args +")");
if (index < navAdapter.getSubscriptionOffset()) {
String tag = navAdapter.getTags().get(index);
loadFragment(tag, args);
@@ -261,7 +270,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
}
public void loadFragment(final String tag, Bundle args) {
- Log.d(TAG, "loadFragment(\"" + tag + "\", " + args + ")");
+ Log.d(TAG, "loadFragment(tag: " + tag + ", args: " + args + ")");
Fragment fragment = null;
switch (tag) {
case QueueFragment.TAG:
@@ -465,6 +474,9 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
cancelLoadTask();
EventDistributor.getInstance().unregister(contentUpdate);
EventBus.getDefault().unregister(this);
+ if(pd != null) {
+ pd.dismiss();
+ }
}
@Override
@@ -543,10 +555,10 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
navAdapter.notifyDataSetChanged();
String lastFragment = getLastNavFragment();
- if(!ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) {
+ if(currentFragment != lastFragment &&
+ !ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) {
long feedId = Long.valueOf(lastFragment);
loadFeedFragmentById(feedId);
- saveLastNavFragment(null);
}
if (handleIntent) {
@@ -568,6 +580,24 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
loadData();
}
+ public void onEventMainThread(ProgressEvent event) {
+ Log.d(TAG, "onEvent(" + event + ")");
+ switch(event.action) {
+ case START:
+ pd = new ProgressDialog(this);
+ pd.setMessage(event.message);
+ pd.setIndeterminate(true);
+ pd.setCancelable(false);
+ pd.show();
+ break;
+ case END:
+ if(pd != null) {
+ pd.dismiss();
+ }
+ break;
+ }
+ }
+
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
index 0cd388b9d..a5ec02cf2 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
@@ -278,6 +278,7 @@ public abstract class MediaplayerActivity extends ActionBarActivity
startActivity(intent);
return true;
} else if (media != null) {
+ FeedItem feedItem = ((FeedMedia) media).getItem();
switch (item.getItemId()) {
case R.id.disable_sleeptimer_item:
if (controller.serviceAvailable()) {
@@ -333,12 +334,20 @@ public abstract class MediaplayerActivity extends ActionBarActivity
break;
case R.id.support_item:
if (media instanceof FeedMedia) {
- FeedItem feedItem = ((FeedMedia) media).getItem();
DBTasks.flattrItemIfLoggedIn(this, feedItem);
}
break;
case R.id.share_link_item:
- ShareUtils.shareLink(this, media.getWebsiteLink());
+ ShareUtils.shareFeedItemLink(this, feedItem);
+ break;
+ case R.id.share_download_url_item:
+ ShareUtils.shareFeedItemDownloadLink(this, feedItem);
+ break;
+ case R.id.share_link_with_position_item:
+ ShareUtils.shareFeedItemLink(this, feedItem, true);
+ break;
+ case R.id.share_download_url_with_position_item:
+ ShareUtils.shareFeedItemDownloadLink(this, feedItem, true);
break;
case R.id.skip_episode_item:
sendBroadcast(new Intent(
diff --git a/app/src/main/java/de/danoeh/antennapod/config/StorageCallbacksImpl.java b/app/src/main/java/de/danoeh/antennapod/config/StorageCallbacksImpl.java
index 943e05690..d8fab34c8 100644
--- a/app/src/main/java/de/danoeh/antennapod/config/StorageCallbacksImpl.java
+++ b/app/src/main/java/de/danoeh/antennapod/config/StorageCallbacksImpl.java
@@ -4,6 +4,7 @@ package de.danoeh.antennapod.config;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import android.media.MediaMetadataRetriever;
import android.util.Log;
import de.danoeh.antennapod.core.StorageCallbacks;
@@ -13,11 +14,11 @@ public class StorageCallbacksImpl implements StorageCallbacks {
@Override
public int getDatabaseVersion() {
- return 15;
+ return 16;
}
@Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ public void onUpgrade(final SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
+ newVersion + ".");
if (oldVersion <= 1) {
@@ -125,7 +126,6 @@ public class StorageCallbacksImpl implements StorageCallbacks {
PodDBAdapter.KEY_CHAPTER_TYPE));
}
if(oldVersion <= 14) {
-
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + PodDBAdapter.KEY_AUTO_DOWNLOAD + " INTEGER");
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
@@ -137,7 +137,6 @@ public class StorageCallbacksImpl implements StorageCallbacks {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
+ " ADD COLUMN " + PodDBAdapter.KEY_HIDE + " TEXT");
-
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
+ " ADD COLUMN " + PodDBAdapter.KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0");
@@ -149,5 +148,38 @@ public class StorageCallbacksImpl implements StorageCallbacks {
db.execSQL(PodDBAdapter.CREATE_INDEX_QUEUE_FEEDITEM);
db.execSQL(PodDBAdapter.CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM);
}
+ if(oldVersion <= 15) {
+ db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ + " ADD COLUMN " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + " INTEGER DEFAULT -1");
+ db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ + " SET " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=0"
+ + " WHERE " + PodDBAdapter.KEY_DOWNLOADED + "=0");
+ Cursor c = db.rawQuery("SELECT " + PodDBAdapter.KEY_FILE_URL
+ + " FROM " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ + " WHERE " + PodDBAdapter.KEY_DOWNLOADED + "=1 "
+ + " AND " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=-1", null);
+ if(c.moveToFirst()) {
+ MediaMetadataRetriever mmr = new MediaMetadataRetriever();
+ do {
+ String fileUrl = c.getString(0);
+ try {
+ mmr.setDataSource(fileUrl);
+ byte[] image = mmr.getEmbeddedPicture();
+ if (image != null) {
+ db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ + " SET " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=1"
+ + " WHERE " + PodDBAdapter.KEY_FILE_URL + "='"+ fileUrl + "'");
+ } else {
+ db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ + " SET " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=0"
+ + " WHERE " + PodDBAdapter.KEY_FILE_URL + "='"+ fileUrl + "'");
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ } while(c.moveToNext());
+ }
+ c.close();
+ }
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
index b2482ae32..f40bcf999 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
@@ -30,8 +30,8 @@ import java.util.concurrent.atomic.AtomicReference;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
-import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
import de.danoeh.antennapod.adapter.AllEpisodesListAdapter;
+import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
import de.danoeh.antennapod.core.asynctask.DownloadObserver;
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
import de.danoeh.antennapod.core.feed.EventDistributor;
@@ -72,6 +72,7 @@ public class AllEpisodesFragment extends Fragment {
private TextView txtvEmpty;
private ProgressBar progLoading;
private ContextMenu contextMenu;
+ private AdapterView.AdapterContextMenuInfo lastMenuInfo = null;
private List<FeedItem> episodes;
private LongList queuedItemsIds;
@@ -341,12 +342,16 @@ public class AllEpisodesFragment extends Fragment {
}
contextMenu = menu;
+ lastMenuInfo = (AdapterView.AdapterContextMenuInfo) menuInfo;
FeedItemMenuHandler.onPrepareMenu(getActivity(), contextMenuInterface, item, true, queuedItemsIds);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+ if(menuInfo == null) {
+ menuInfo = lastMenuInfo;
+ }
FeedItem selectedItem = itemAccess.getItem(menuInfo.position);
if (selectedItem == null) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
index 67e65a6ce..5a788b10c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
@@ -83,6 +83,7 @@ public class ItemlistFragment extends ListFragment {
protected FeedItemlistAdapter adapter;
private ContextMenu contextMenu;
+ private AdapterView.AdapterContextMenuInfo lastMenuInfo = null;
private long feedID;
private Feed feed;
@@ -217,6 +218,11 @@ public class ItemlistFragment extends ListFragment {
return false;
}
});
+ if(feed == null || feed.getLink() == null) {
+ menu.findItem(R.id.share_link_item).setVisible(false);
+ menu.findItem(R.id.visit_website_item).setVisible(false);
+ }
+
isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
}
@@ -302,12 +308,16 @@ public class ItemlistFragment extends ListFragment {
}
contextMenu = menu;
+ lastMenuInfo = (AdapterView.AdapterContextMenuInfo) menuInfo;
FeedItemMenuHandler.onPrepareMenu(getActivity(), contextMenuInterface, item, true, queuedItemsIds);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+ if(menuInfo == null) {
+ menuInfo = lastMenuInfo;
+ }
// because of addHeaderView(), positions are increased by 1!
FeedItem selectedItem = itemAccess.getItem(menuInfo.position-1);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
index 0a825c51a..77b2d590f 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -72,6 +72,7 @@ public class QueueFragment extends Fragment {
private ProgressBar progLoading;
private ContextMenu contextMenu;
+ private AdapterView.AdapterContextMenuInfo lastMenuInfo = null;
private UndoBarController<FeedItemUndoToken> undoBarController;
@@ -325,6 +326,7 @@ public class QueueFragment extends Fragment {
}
contextMenu = menu;
+ lastMenuInfo = (AdapterView.AdapterContextMenuInfo) menuInfo;
LongList queueIds = new LongList(queue.size());
for(FeedItem queueItem : queue) {
queueIds.add(queueItem.getId());
@@ -335,6 +337,9 @@ public class QueueFragment extends Fragment {
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+ if(menuInfo == null) {
+ menuInfo = lastMenuInfo;
+ }
FeedItem selectedItem = itemAccess.getItem(menuInfo.position);
if (selectedItem == null) {
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
index 64ba3dca3..c33ab93b4 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
@@ -85,8 +85,19 @@ public class FeedItemMenuHandler {
if (!(!isInQueue && selectedItem.getMedia() != null)) {
mi.setItemVisibility(R.id.add_to_queue_item, false);
}
+
if (!showExtendedMenu || selectedItem.getLink() == null) {
+ mi.setItemVisibility(R.id.visit_website_item, false);
mi.setItemVisibility(R.id.share_link_item, false);
+ mi.setItemVisibility(R.id.share_link_with_position_item, false);
+ }
+ if (!showExtendedMenu || !hasMedia || selectedItem.getMedia().getDownload_url() == null) {
+ mi.setItemVisibility(R.id.share_download_url_item, false);
+ mi.setItemVisibility(R.id.share_download_url_with_position_item, false);
+ }
+ if(false == hasMedia || selectedItem.getMedia().getPosition() <= 0) {
+ mi.setItemVisibility(R.id.share_link_with_position_item, false);
+ mi.setItemVisibility(R.id.share_download_url_with_position_item, false);
}
if (!(state == FeedItem.State.UNREAD || state == FeedItem.State.IN_PROGRESS)) {
@@ -109,12 +120,6 @@ public class FeedItemMenuHandler {
mi.setItemVisibility(R.id.deactivate_auto_download, false);
}
- if (!showExtendedMenu || selectedItem.getLink() == null ||
- false == IntentUtils.isCallable(context, new Intent(Intent.ACTION_VIEW, Uri.parse(selectedItem.getLink()))))
- {
- mi.setItemVisibility(R.id.visit_website_item, false);
- }
-
if (selectedItem.getPaymentLink() == null || !selectedItem.getFlattrStatus().flattrable()) {
mi.setItemVisibility(R.id.support_item, false);
}
@@ -213,6 +218,15 @@ public class FeedItemMenuHandler {
case R.id.share_link_item:
ShareUtils.shareFeedItemLink(context, selectedItem);
break;
+ case R.id.share_download_url_item:
+ ShareUtils.shareFeedItemDownloadLink(context, selectedItem);
+ break;
+ case R.id.share_link_with_position_item:
+ ShareUtils.shareFeedItemLink(context, selectedItem, true);
+ break;
+ case R.id.share_download_url_with_position_item:
+ ShareUtils.shareFeedItemDownloadLink(context, selectedItem, true);
+ break;
default:
Log.d(TAG, "Unknown menuItemId: " + menuItemId);
return false;
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
index 85394d01e..30cc2c640 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
@@ -42,10 +42,11 @@ public class FeedMenuHandler {
Log.d(TAG, "Preparing options menu");
menu.findItem(R.id.mark_all_read_item).setVisible(selectedFeed.hasNewItems());
- if (selectedFeed.getPaymentLink() != null && selectedFeed.getFlattrStatus().flattrable())
+ if (selectedFeed.getPaymentLink() != null && selectedFeed.getFlattrStatus().flattrable()) {
menu.findItem(R.id.support_item).setVisible(true);
- else
+ } else {
menu.findItem(R.id.support_item).setVisible(false);
+ }
menu.findItem(R.id.refresh_complete_item).setVisible(selectedFeed.isPaged());
@@ -99,7 +100,7 @@ public class FeedMenuHandler {
case R.id.share_link_item:
ShareUtils.shareFeedlink(context, selectedFeed);
break;
- case R.id.share_source_item:
+ case R.id.share_download_url_item:
ShareUtils.shareFeedDownloadLink(context, selectedFeed);
break;
default:
diff --git a/app/src/main/res/layout/cover_fragment.xml b/app/src/main/res/layout/cover_fragment.xml
index 18540aa1f..4bbdeae06 100644
--- a/app/src/main/res/layout/cover_fragment.xml
+++ b/app/src/main/res/layout/cover_fragment.xml
@@ -13,7 +13,7 @@
android:layout_height="match_parent"
android:layout_gravity="center"
android:adjustViewBounds="true"
- android:scaleType="centerInside"
+ android:scaleType="fitCenter"
tools:src="@android:drawable/sym_def_app_icon" />
-</RelativeLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/app/src/main/res/layout/feedinfo.xml b/app/src/main/res/layout/feedinfo.xml
index db897865c..4dab1e189 100644
--- a/app/src/main/res/layout/feedinfo.xml
+++ b/app/src/main/res/layout/feedinfo.xml
@@ -20,8 +20,8 @@
<ImageView
android:id="@+id/imgvCover"
android:contentDescription="@string/cover_label"
- android:layout_width="70dp"
- android:layout_height="70dp"
+ android:layout_width="80dp"
+ android:layout_height="80dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
tools:src="@drawable/ic_stat_antenna_default"
@@ -33,7 +33,9 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
+ android:layout_alignTop="@id/imgvCover"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_alignBottom="@id/imgvCover"
style="@style/AntennaPod.TextView.Heading"
tools:text="Feed title"
tools:background="@android:color/holo_green_dark"/>
@@ -52,7 +54,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
- android:scrollbarStyle="outsideInset"
+ android:scrollbarStyle="outsideOverlay"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="8dp">
@@ -119,7 +121,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
- android:layout_marginBottom="8dp"
app:layout_row="2"
app:layout_column="0"
android:lines="1"
@@ -129,10 +130,13 @@
<TextView
android:id="@+id/txtvUrl"
- android:layout_width="wrap_content"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:paddingBottom="4dp"
app:layout_row="2"
app:layout_column="1"
+ app:layout_gravity="fill"
+ android:maxLines="4"
tools:text="http://www.example.com/feed"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/menu/allepisodes_context.xml b/app/src/main/res/menu/allepisodes_context.xml
index f89ad5065..171e509a8 100644
--- a/app/src/main/res/menu/allepisodes_context.xml
+++ b/app/src/main/res/menu/allepisodes_context.xml
@@ -40,13 +40,32 @@
android:title="@string/deactivate_auto_download" />
<item
- android:id="@+id/share_link_item"
- android:menuCategory="container"
- android:title="@string/share_link_label" />
- <item
android:id="@+id/visit_website_item"
android:menuCategory="container"
android:title="@string/visit_website_label" />
+ <item
+ android:id="@+id/share_item"
+ android:menuCategory="container"
+ android:title="@string/share_label">
+ <menu>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_label" />
+ <item
+ android:id="@+id/share_link_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_with_position_label" />
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_label" />
+ <item
+ android:id="@+id/share_download_url_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_with_position_label" />
+ </menu>
+ </item>
<item
android:id="@+id/support_item"
diff --git a/app/src/main/res/menu/feedinfo.xml b/app/src/main/res/menu/feedinfo.xml
index be50cb87d..94f34db93 100644
--- a/app/src/main/res/menu/feedinfo.xml
+++ b/app/src/main/res/menu/feedinfo.xml
@@ -20,7 +20,7 @@
android:title="@string/share_link_label">
</item>
<item
- android:id="@+id/share_source_item"
+ android:id="@+id/share_download_url_item"
custom:showAsAction="collapseActionView"
android:title="@string/share_source_label">
</item>
diff --git a/app/src/main/res/menu/feeditem_options.xml b/app/src/main/res/menu/feeditem_options.xml
index f8e9b9c75..650912ea2 100644
--- a/app/src/main/res/menu/feeditem_options.xml
+++ b/app/src/main/res/menu/feeditem_options.xml
@@ -48,17 +48,36 @@
</item>
<item
- android:id="@+id/share_link_item"
- custom:showAsAction="collapseActionView"
- android:title="@string/share_link_label">
- </item>
- <item
android:id="@+id/visit_website_item"
android:icon="?attr/location_web_site"
custom:showAsAction="ifRoom|collapseActionView"
android:title="@string/visit_website_label">
</item>
<item
+ android:id="@+id/share_item"
+ android:menuCategory="container"
+ android:title="@string/share_label">
+ <menu>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_label" />
+ <item
+ android:id="@+id/share_link_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_with_position_label" />
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_label" />
+ <item
+ android:id="@+id/share_download_url_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_with_position_label" />
+ </menu>
+ </item>
+
+ <item
android:id="@+id/support_item"
custom:showAsAction="collapseActionView"
android:title="@string/support_label">
diff --git a/app/src/main/res/menu/feeditemlist_context.xml b/app/src/main/res/menu/feeditemlist_context.xml
index f89ad5065..7b10e5cce 100644
--- a/app/src/main/res/menu/feeditemlist_context.xml
+++ b/app/src/main/res/menu/feeditemlist_context.xml
@@ -40,13 +40,33 @@
android:title="@string/deactivate_auto_download" />
<item
- android:id="@+id/share_link_item"
- android:menuCategory="container"
- android:title="@string/share_link_label" />
- <item
android:id="@+id/visit_website_item"
android:menuCategory="container"
android:title="@string/visit_website_label" />
+ <item
+ android:id="@+id/share_item"
+ android:menuCategory="container"
+ android:title="@string/share_label">
+ <menu>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_label" />
+ <item
+ android:id="@+id/share_link_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_with_position_label" />
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_label" />
+ <item
+ android:id="@+id/share_download_url_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_with_position_label" />
+ </menu>
+ </item>
+
<item
android:id="@+id/support_item"
diff --git a/app/src/main/res/menu/feedlist.xml b/app/src/main/res/menu/feedlist.xml
index e0da72667..e6e85093b 100644
--- a/app/src/main/res/menu/feedlist.xml
+++ b/app/src/main/res/menu/feedlist.xml
@@ -36,6 +36,7 @@
android:title="@string/mark_all_read_label"
custom:showAsAction="collapseActionView">
</item>
+
<item
android:id="@+id/support_item"
android:menuCategory="container"
@@ -43,6 +44,28 @@
android:visible="false"
custom:showAsAction="collapseActionView">
</item>
+
+ <item
+ android:id="@+id/visit_website_item"
+ android:icon="?attr/location_web_site"
+ android:menuCategory="container"
+ custom:showAsAction="collapseActionView"
+ android:title="@string/visit_website_label"
+ android:visible="true">
+ </item>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ custom:showAsAction="collapseActionView"
+ android:title="@string/share_link_label">
+ </item>
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ custom:showAsAction="collapseActionView"
+ android:title="@string/share_feed_url_label">
+ </item>
+
<item
android:id="@+id/remove_item"
android:icon="?attr/content_discard"
diff --git a/app/src/main/res/menu/mediaplayer.xml b/app/src/main/res/menu/mediaplayer.xml
index 288e44401..053e68552 100644
--- a/app/src/main/res/menu/mediaplayer.xml
+++ b/app/src/main/res/menu/mediaplayer.xml
@@ -13,11 +13,14 @@
custom:showAsAction="collapseActionView"
android:title="@string/set_sleeptimer_label">
</item>
+
<item
- android:id="@+id/share_link_item"
+ android:id="@+id/skip_episode_item"
custom:showAsAction="collapseActionView"
- android:title="@string/share_link_label">
+ android:title="@string/skip_episode_label"
+ android:visible="true">
</item>
+
<item
android:id="@+id/visit_website_item"
android:icon="?attr/location_web_site"
@@ -26,15 +29,33 @@
android:visible="false">
</item>
<item
+ android:id="@+id/share_item"
+ android:menuCategory="container"
+ android:title="@string/share_label">
+ <menu>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_label" />
+ <item
+ android:id="@+id/share_link_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_with_position_label" />
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_label" />
+ <item
+ android:id="@+id/share_download_url_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_with_position_label" />
+ </menu>
+ </item>
+ <item
android:id="@+id/support_item"
custom:showAsAction="collapseActionView"
android:title="@string/support_label"
android:visible="false">
</item>
- <item
- android:id="@id/skip_episode_item"
- custom:showAsAction="collapseActionView"
- android:title="@string/skip_episode_label"
- android:visible="true"/>
</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/queue_context.xml b/app/src/main/res/menu/queue_context.xml
index 6ab2daabf..d09f3c84c 100644
--- a/app/src/main/res/menu/queue_context.xml
+++ b/app/src/main/res/menu/queue_context.xml
@@ -36,21 +36,38 @@
android:id="@+id/activate_auto_download"
android:menuCategory="container"
android:title="@string/activate_auto_download" />
-
<item
android:id="@+id/deactivate_auto_download"
android:menuCategory="container"
android:title="@string/deactivate_auto_download" />
<item
- android:id="@+id/share_link_item"
- android:menuCategory="container"
- android:title="@string/share_link_label" />
- <item
android:id="@+id/visit_website_item"
android:menuCategory="container"
android:title="@string/visit_website_label" />
-
+ <item
+ android:id="@+id/share_item"
+ android:menuCategory="container"
+ android:title="@string/share_label">
+ <menu>
+ <item
+ android:id="@+id/share_link_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_label" />
+ <item
+ android:id="@+id/share_link_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_link_with_position_label" />
+ <item
+ android:id="@+id/share_download_url_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_label" />
+ <item
+ android:id="@+id/share_download_url_with_position_item"
+ android:menuCategory="container"
+ android:title="@string/share_item_url_with_position_label" />
+ </menu>
+ </item>
<item
android:id="@+id/support_item"
android:menuCategory="container"
diff --git a/core/src/androidTest/java/de/danoeh/antennapod/core/tests/util/DateUtilsTest.java b/core/src/androidTest/java/de/danoeh/antennapod/core/tests/util/DateUtilsTest.java
index 2a2d6414a..7429b50b3 100644
--- a/core/src/androidTest/java/de/danoeh/antennapod/core/tests/util/DateUtilsTest.java
+++ b/core/src/androidTest/java/de/danoeh/antennapod/core/tests/util/DateUtilsTest.java
@@ -66,6 +66,14 @@ public class DateUtilsTest extends AndroidTestCase {
assertEquals(expected, actual);
}
+ public void testParseDateWithTimezoneName2() throws Exception {
+ GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 6, 31, 0);
+ exp.setTimeZone(TimeZone.getTimeZone("UTC"));
+ Date expected = new Date(exp.getTimeInMillis());
+ Date actual = DateUtils.parse("Sat, 28 Mar 2015 01:31 EST");
+ assertEquals(expected, actual);
+ }
+
public void testParseDateWithTimeZoneOffset() throws Exception {
GregorianCalendar exp = new GregorianCalendar(2015, 2, 28, 12, 16, 12);
exp.setTimeZone(TimeZone.getTimeZone("UTC"));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/ProgressEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/ProgressEvent.java
new file mode 100644
index 000000000..3769d6bb1
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/event/ProgressEvent.java
@@ -0,0 +1,36 @@
+package de.danoeh.antennapod.core.event;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ProgressEvent {
+
+ public enum Action {
+ START, END
+ }
+
+ public final Action action;
+ public final String message;
+
+ private ProgressEvent(Action action, String message) {
+ this.action = action;
+ this.message = message;
+ }
+
+ public static ProgressEvent start(String message) {
+ return new ProgressEvent(Action.START, message);
+ }
+
+ public static ProgressEvent end() {
+ return new ProgressEvent(Action.END, null);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("action", action)
+ .append("message", message)
+ .toString();
+ }
+
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
index ee05020cc..b4cca505c 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
@@ -35,6 +35,8 @@ public class FeedMedia extends FeedFile implements Playable {
private String mime_type;
private volatile FeedItem item;
private Date playbackCompletionDate;
+
+ // if null: unknown, will be checked
private Boolean hasEmbeddedPicture;
/* Used for loading item when restoring from parcel. */
@@ -63,6 +65,15 @@ public class FeedMedia extends FeedFile implements Playable {
? null : (Date) playbackCompletionDate.clone();
}
+ public FeedMedia(long id, FeedItem item, int duration, int position,
+ long size, String mime_type, String file_url, String download_url,
+ boolean downloaded, Date playbackCompletionDate, int played_duration,
+ Boolean hasEmbeddedPicture) {
+ this(id, item, duration, position, size, mime_type, file_url, download_url, downloaded,
+ playbackCompletionDate, played_duration);
+ this.hasEmbeddedPicture = hasEmbeddedPicture;
+ }
+
@Override
public String getHumanReadableIdentifier() {
if (item != null && item.getTitle() != null) {
@@ -429,6 +440,10 @@ public class FeedMedia extends FeedFile implements Playable {
}
}
+ public void setHasEmbeddedPicture(Boolean hasEmbeddedPicture) {
+ this.hasEmbeddedPicture = hasEmbeddedPicture;
+ }
+
@Override
public void setDownloaded(boolean downloaded) {
super.setDownloaded(downloaded);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index fae6dee1d..4e386321e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -1144,6 +1144,7 @@ public class DownloadService extends Service {
boolean chaptersRead = false;
media.setDownloaded(true);
media.setFile_url(request.getDestination());
+ media.setHasEmbeddedPicture(null);
// Get duration
MediaMetadataRetriever mmr = null;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
index 3f6769ee4..43a91933c 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
@@ -634,7 +634,7 @@ public class PlaybackService extends Service {
writePlaybackPreferencesNoMediaPlaying();
if (nextMedia != null) {
- stream = !playable.localFileAvailable();
+ stream = !nextMedia.localFileAvailable();
mediaPlayer.playMediaObject(nextMedia, stream, startWhenPrepared, prepareImmediately);
sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD,
(nextMedia.getMediaType() == MediaType.VIDEO) ? EXTRA_CODE_VIDEO : EXTRA_CODE_AUDIO);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index dc24c5784..4a329c2f6 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -274,6 +274,18 @@ public final class DBReader {
playbackCompletionDate = new Date(
playbackCompletionTime);
}
+ Boolean hasEmbeddedPicture;
+ switch(cursor.getInt(cursor.getColumnIndex(PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE))) {
+ case 1:
+ hasEmbeddedPicture = Boolean.TRUE;
+ break;
+ case 0:
+ hasEmbeddedPicture = Boolean.FALSE;
+ break;
+ default:
+ hasEmbeddedPicture = null;
+ break;
+ }
return new FeedMedia(
mediaId,
@@ -286,7 +298,8 @@ public final class DBReader {
cursor.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX),
cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0,
playbackCompletionDate,
- cursor.getInt(PodDBAdapter.KEY_PLAYED_DURATION_INDEX));
+ cursor.getInt(PodDBAdapter.KEY_PLAYED_DURATION_INDEX),
+ hasEmbeddedPicture);
}
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter,
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
index fe5d0dfd3..feeee48c5 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
@@ -100,6 +100,7 @@ public class DBWriter {
}
media.setDownloaded(false);
media.setFile_url(null);
+ media.setHasEmbeddedPicture(false);
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setMedia(media);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index 6fabf9005..ed3cb71e9 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -19,6 +19,8 @@ import java.util.List;
import de.danoeh.antennapod.core.BuildConfig;
import de.danoeh.antennapod.core.ClientConfig;
+import de.danoeh.antennapod.core.R;
+import de.danoeh.antennapod.core.event.ProgressEvent;
import de.danoeh.antennapod.core.feed.Chapter;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedComponent;
@@ -29,6 +31,7 @@ import de.danoeh.antennapod.core.feed.FeedPreferences;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.util.LongIntMap;
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
+import de.greenrobot.event.EventBus;
;
@@ -155,6 +158,8 @@ public class PodDBAdapter {
public static final String KEY_NEXT_PAGE_LINK = "next_page_link";
public static final String KEY_HIDE = "hide";
public static final String KEY_LAST_UPDATE_FAILED = "last_update_failed";
+ public static final String KEY_HAS_EMBEDDED_PICTURE = "has_embedded_picture";
+
// Table names
public static final String TABLE_NAME_FEEDS = "Feeds";
@@ -209,7 +214,7 @@ public class PodDBAdapter {
+ KEY_PLAYBACK_COMPLETION_DATE + " INTEGER,"
+ KEY_FEEDITEM + " INTEGER,"
+ KEY_PLAYED_DURATION + " INTEGER,"
- + KEY_AUTO_DOWNLOAD + " INTEGER)";
+ + KEY_HAS_EMBEDDED_PICTURE + " INTEGER)";
public static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE "
+ TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE
@@ -516,6 +521,7 @@ public class PodDBAdapter {
values.put(KEY_DOWNLOAD_URL, media.getDownload_url());
values.put(KEY_DOWNLOADED, media.isDownloaded());
values.put(KEY_FILE_URL, media.getFile_url());
+ values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture());
if (media.getPlaybackCompletionDate() != null) {
values.put(KEY_PLAYBACK_COMPLETION_DATE, media
@@ -1463,6 +1469,9 @@ public class PodDBAdapter {
* Helper class for opening the Antennapod database.
*/
private static class PodDBHelper extends SQLiteOpenHelper {
+
+ private Context context;
+
/**
* Constructor.
*
@@ -1474,6 +1483,7 @@ public class PodDBAdapter {
public PodDBHelper(final Context context, final String name,
final CursorFactory factory, final int version) {
super(context, name, factory, version);
+ this.context = context;
}
@Override
@@ -1497,7 +1507,9 @@ public class PodDBAdapter {
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
final int newVersion) {
+ EventBus.getDefault().post(ProgressEvent.start(context.getString(R.string.progress_upgrading_database)));
ClientConfig.storageCallbacks.onUpgrade(db, oldVersion, newVersion);
+ EventBus.getDefault().post(ProgressEvent.end());
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
index b6df2dc85..10512dd48 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
@@ -49,6 +49,10 @@ public class DateUtils {
"EEE, dd MMMM yyyy HH:mm:ss Z",
"EEEE, dd MMM yy HH:mm:ss Z",
"EEE MMM d HH:mm:ss yyyy",
+ "EEE, dd MMM yyyy HH:mm Z",
+ "EEE, dd MMMM yyyy HH:mm Z",
+ "EEEE, dd MMM yy HH:mm Z",
+ "EEE MMM d HH:mm yyyy",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd'T'HH:mm:ss.SSS",
"yyyy-MM-dd'T'HH:mm:ss.SSS Z",
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
index 85f32ed50..c065a62c3 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
@@ -2,6 +2,8 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.content.Intent;
+
+import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedItem;
@@ -11,24 +13,49 @@ public class ShareUtils {
private ShareUtils() {}
- public static void shareLink(Context context, String link) {
+ public static void shareLink(Context context, String text) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
- i.putExtra(Intent.EXTRA_SUBJECT, "Sharing URL");
- i.putExtra(Intent.EXTRA_TEXT, link);
- context.startActivity(Intent.createChooser(i, "Share URL"));
+ i.putExtra(Intent.EXTRA_TEXT, text);
+ context.startActivity(Intent.createChooser(i, context.getString(R.string.share_url_label)));
}
-
- public static void shareFeedItemLink(Context context, FeedItem item) {
- shareLink(context, item.getLink());
+
+ public static void shareFeedlink(Context context, Feed feed) {
+ shareLink(context, feed.getLink());
}
public static void shareFeedDownloadLink(Context context, Feed feed) {
shareLink(context, feed.getDownload_url());
}
-
- public static void shareFeedlink(Context context, Feed feed) {
- shareLink(context, feed.getLink());
+
+ public static void shareFeedItemLink(Context context, FeedItem item) {
+ shareFeedItemLink(context, item, false);
+ }
+
+ public static void shareFeedItemDownloadLink(Context context, FeedItem item) {
+ shareFeedItemDownloadLink(context, item, false);
+ }
+
+ public static void shareFeedItemLink(Context context, FeedItem item, boolean withPosition) {
+ String text;
+ if(withPosition) {
+ int pos = item.getMedia().getPosition();
+ text = item.getLink() + " [" + Converter.getDurationStringLong(pos) + "]";
+ } else {
+ text = item.getLink();
+ }
+ shareLink(context, text);
+ }
+
+ public static void shareFeedItemDownloadLink(Context context, FeedItem item, boolean withPosition) {
+ String text;
+ if(withPosition) {
+ int pos = item.getMedia().getPosition();
+ text = item.getMedia().getDownload_url() + " [" + Converter.getDurationStringLong(pos) + "]";
+ } else {
+ text = item.getMedia().getDownload_url();
+ }
+ shareLink(context, text);
}
}
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index cf0630ea0..c2147cccc 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -7,27 +7,27 @@
<!-- Activitiy and fragment titles -->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Feeds</string>
- <string name="add_feed_label">Add podcast</string>
+ <string name="add_feed_label">Add Podcast</string>
<string name="podcasts_label">PODCASTS</string>
<string name="episodes_label">EPISODES</string>
- <string name="new_episodes_label">New episodes</string>
- <string name="all_episodes_label">All episodes</string>
+ <string name="new_episodes_label">New Episodes</string>
+ <string name="all_episodes_label">All Episodes</string>
<string name="new_label">New</string>
- <string name="waiting_list_label">Waiting list</string>
+ <string name="waiting_list_label">Waiting List</string>
<string name="settings_label">Settings</string>
- <string name="add_new_feed_label">Add podcast</string>
+ <string name="add_new_feed_label">Add Podcast</string>
<string name="downloads_label">Downloads</string>
<string name="downloads_running_label">Running</string>
<string name="downloads_completed_label">Completed</string>
<string name="downloads_log_label">Log</string>
<string name="cancel_download_label">Cancel Download</string>
- <string name="playback_history_label">Playback history</string>
+ <string name="playback_history_label">Playback History</string>
<string name="gpodnet_main_label">gpodder.net</string>
- <string name="gpodnet_auth_label">gpodder.net login</string>
+ <string name="gpodnet_auth_label">gpodder.net Login</string>
<!-- New episodes fragment -->
<string name="recently_published_episodes_label">Recently published</string>
- <string name="episode_filter_label">Show only new episodes</string>
+ <string name="episode_filter_label">Show only new Episodes</string>
<!-- Main activity -->
<string name="drawer_open">Open menu</string>
@@ -35,14 +35,14 @@
<string name="drawer_preferences">Drawer Preferences</string>
<!-- Webview actions -->
- <string name="open_in_browser_label">Open in browser</string>
+ <string name="open_in_browser_label">Open in Browser</string>
<string name="copy_url_label">Copy URL</string>
<string name="share_url_label">Share URL</string>
- <string name="copied_url_msg">Copied URL to clipboard.</string>
- <string name="go_to_position_label">Go to this position</string>
+ <string name="copied_url_msg">Copied URL to Clipboard</string>
+ <string name="go_to_position_label">Go to this Position</string>
<!-- Playback history -->
- <string name="clear_history_label">Clear history</string>
+ <string name="clear_history_label">Clear History</string>
<!-- Other -->
<string name="confirm_label">Confirm</string>
@@ -59,7 +59,7 @@
<string name="chapters_label">Chapters</string>
<string name="shownotes_label">Shownotes</string>
<string name="description_label">Description</string>
- <string name="most_recent_prefix">Most Recent Episode:\u0020</string>
+ <string name="most_recent_prefix">Most recent episode:\u0020</string>
<string name="episodes_suffix">\u0020episodes</string>
<string name="length_prefix">Length:\u0020</string>
<string name="size_prefix">Size:\u0020</string>
@@ -75,23 +75,27 @@
<string name="feedurl_label">Feed URL</string>
<string name="etxtFeedurlHint">www.example.com/feed</string>
<string name="txtvfeedurl_label">Add Podcast by URL</string>
- <string name="podcastdirectories_label">Find podcast in directory</string>
+ <string name="podcastdirectories_label">Find Podcast in Directory</string>
<string name="podcastdirectories_descr">You can search for new podcasts by name, category or popularity in the gpodder.net directory, or search the iTunes store.</string>
<string name="browse_gpoddernet_label">Browse gpodder.net</string>
<!-- Actions on feeds -->
<string name="mark_all_read_label">Mark all as played</string>
- <string name="mark_all_read_msg">Marked all episodes as played</string>
+ <string name="mark_all_read_msg">Marked all Episodes as played</string>
<string name="mark_all_read_confirmation_msg">Please confirm that you want to mark all episodes as being played.</string>
<string name="mark_all_read_feed_confirmation_msg">Please confirm that you want to mark all episodes in this feed as being played.</string>
<string name="show_info_label">Show information</string>
- <string name="remove_feed_label">Remove podcast</string>
- <string name="share_link_label">Share website link</string>
- <string name="share_source_label">Share feed link</string>
+ <string name="remove_feed_label">Remove Podcast</string>
+ <string name="share_label">Share...</string>
+ <string name="share_link_label">Share Link</string>
+ <string name="share_link_with_position_label">Share Link with Position</string>
+ <string name="share_feed_url_label">Share Feed URL</string>
+ <string name="share_item_url_label">Share Episode URL</string>
+ <string name="share_item_url_with_position_label">Share Episode URL with Position</string>
<string name="feed_delete_confirmation_msg">Please confirm that you want to delete this feed and ALL episodes of this feed that you have downloaded.</string>
- <string name="feed_remover_msg">Removing feed</string>
- <string name="load_complete_feed">Refresh complete feed</string>
- <string name="hide_episodes_title">Hide episodes</string>
+ <string name="feed_remover_msg">Removing Feed</string>
+ <string name="load_complete_feed">Refresh complete Feed</string>
+ <string name="hide_episodes_title">Hide Episodes</string>
<string name="hide_unplayed_episodes_label">Unplayed</string>
<string name="hide_paused_episodes_label">Paused</string>
<string name="hide_played_episodes_label">Played</string>
@@ -100,7 +104,7 @@
<string name="hide_downloaded_episodes_label">Downloaded</string>
<string name="hide_not_downloaded_episodes_label">Not downloaded</string>
<string name="filtered_label">Filtered</string>
- <string name="refresh_failed_msg">{fa-exclamation-circle} Last refresh failed</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} Last Refresh failed</string>
<!-- actions on feeditems -->
<string name="download_label">Download</string>
@@ -109,7 +113,7 @@
<string name="stop_label">Stop</string>
<string name="stream_label">Stream</string>
<string name="remove_label">Remove</string>
- <string name="remove_episode_lable">Remove episode</string>
+ <string name="remove_episode_lable">Remove Episode</string>
<string name="mark_read_label">Mark as played</string>
<string name="mark_unread_label">Mark as unplayed</string>
<string name="marked_as_read_label">Marked as played</string>
@@ -121,39 +125,39 @@
<string name="enqueue_all_new">Enqueue all</string>
<string name="download_all">Download all</string>
<string name="skip_episode_label">Skip episode</string>
- <string name="activate_auto_download">Activate auto download</string>
- <string name="deactivate_auto_download">Deactivate auto download</string>
- <string name="reset_position">Reset playback position</string>
+ <string name="activate_auto_download">Activate Auto Download</string>
+ <string name="deactivate_auto_download">Deactivate Auto Download</string>
+ <string name="reset_position">Reset Playback Position</string>
<!-- Download messages and labels -->
<string name="download_successful">successful</string>
<string name="download_failed">failed</string>
<string name="download_pending">Download pending</string>
<string name="download_running">Download running</string>
- <string name="download_error_device_not_found">Storage device not found</string>
- <string name="download_error_insufficient_space">Insufficient space</string>
- <string name="download_error_file_error">File error</string>
+ <string name="download_error_device_not_found">Storage Device not found</string>
+ <string name="download_error_insufficient_space">Insufficient Space</string>
+ <string name="download_error_file_error">File Error</string>
<string name="download_error_http_data_error">HTTP Data Error</string>
<string name="download_error_error_unknown">Unknown Error</string>
<string name="download_error_parser_exception">Parser Exception</string>
- <string name="download_error_unsupported_type">Unsupported Feed type</string>
- <string name="download_error_connection_error">Connection error</string>
- <string name="download_error_unknown_host">Unknown host</string>
- <string name="download_error_unauthorized">Authentication error</string>
+ <string name="download_error_unsupported_type">Unsupported Feed Type</string>
+ <string name="download_error_connection_error">Connection Error</string>
+ <string name="download_error_unknown_host">Unknown Host</string>
+ <string name="download_error_unauthorized">Authentication Error</string>
<string name="cancel_all_downloads_label">Cancel all downloads</string>
<string name="download_canceled_msg">Download canceled</string>
<string name="download_canceled_autodownload_enabled_msg">Download canceled\nDisabled <i>Auto Download</i> for this item</string>
<string name="download_report_title">Downloads completed with error(s)</string>
- <string name="download_report_content_title">Download report</string>
+ <string name="download_report_content_title">Download Report</string>
<string name="download_error_malformed_url">Malformed URL</string>
<string name="download_error_io_error">IO Error</string>
- <string name="download_error_request_error">Request error</string>
- <string name="download_error_db_access">Database access error</string>
+ <string name="download_error_request_error">Request Error</string>
+ <string name="download_error_db_access">Database Access Error</string>
<string name="downloads_left">\u0020Downloads left</string>
<string name="downloads_processing">Processing downloads</string>
<string name="download_notification_title">Downloading podcast data</string>
<string name="download_report_content">%1$d downloads succeeded, %2$d failed</string>
- <string name="download_log_title_unknown">Unknown title</string>
+ <string name="download_log_title_unknown">Unknown Title</string>
<string name="download_type_feed">Feed</string>
<string name="download_type_media">Media file</string>
<string name="download_type_image">Image</string>
@@ -181,9 +185,9 @@
<string name="unknown_media_key">AntennaPod - Unknown media key: %1$d</string>
<!-- Queue operations -->
- <string name="lock_queue">Lock queue</string>
- <string name="unlock_queue">Unlock queue</string>
- <string name="clear_queue_label">Clear queue</string>
+ <string name="lock_queue">Lock Queue</string>
+ <string name="unlock_queue">Unlock Queue</string>
+ <string name="clear_queue_label">Clear Queue</string>
<string name="undo">Undo</string>
<string name="removed_from_queue">Item removed</string>
<string name="move_to_top_label">Move to top</string>
@@ -249,38 +253,38 @@
<string name="pref_smart_mark_as_played_title">Smart mark as played</string>
<string name="playback_pref">Playback</string>
<string name="network_pref">Network</string>
- <string name="pref_autoUpdateIntervall_title">Update interval</string>
+ <string name="pref_autoUpdateIntervall_title">Update Interval</string>
<string name="pref_autoUpdateIntervall_sum">Specify an interval in which the feeds are refreshed automatically or disable it</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Download media files only over WiFi</string>
- <string name="pref_followQueue_title">Continuous playback</string>
+ <string name="pref_followQueue_title">Continuous Playback</string>
<string name="pref_downloadMediaOnWifiOnly_title">WiFi media download</string>
- <string name="pref_pauseOnHeadsetDisconnect_title">Headphones disconnect</string>
- <string name="pref_unpauseOnHeadsetReconnect_title">Headphones reconnect</string>
- <string name="pref_mobileUpdate_title">Mobile updates</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Headphones Disconnect</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Headphones Reconnect</string>
+ <string name="pref_mobileUpdate_title">Mobile Updates</string>
<string name="pref_mobileUpdate_sum">Allow updates over the mobile data connection</string>
<string name="refreshing_label">Refreshing</string>
<string name="flattr_settings_label">Flattr settings</string>
<string name="pref_flattr_auth_title">Flattr sign-in</string>
<string name="pref_flattr_auth_sum">Sign in to your flattr account to flattr things directly from the app.</string>
- <string name="pref_flattr_this_app_title">Flattr this app</string>
+ <string name="pref_flattr_this_app_title">Flattr this App</string>
<string name="pref_flattr_this_app_sum">Support the development of AntennaPod by flattring it. Thanks!</string>
<string name="pref_revokeAccess_title">Revoke access</string>
<string name="pref_revokeAccess_sum">Revoke the access permission to your flattr account for this app.</string>
<string name="pref_auto_flattr_title">Automatic Flattr</string>
<string name="pref_auto_flattr_sum">Configure automatic flattring</string>
<string name="user_interface_label">User Interface</string>
- <string name="pref_set_theme_title">Select theme</string>
- <string name="pref_nav_drawer_items_title">Change navigation drawer</string>
+ <string name="pref_set_theme_title">Select Theme</string>
+ <string name="pref_nav_drawer_items_title">Change Navigation Drawer</string>
<string name="pref_nav_drawer_items_sum">Change which items appear in the navigation drawer.</string>
<string name="pref_set_theme_sum">Change the appearance of AntennaPod.</string>
- <string name="pref_automatic_download_title">Automatic download</string>
+ <string name="pref_automatic_download_title">Automatic Download</string>
<string name="pref_automatic_download_sum">Configure the automatic download of episodes.</string>
<string name="pref_autodl_wifi_filter_title">Enable Wi-Fi filter</string>
<string name="pref_autodl_wifi_filter_sum">Allow automatic download only for selected Wi-Fi networks.</string>
<string name="pref_automatic_download_on_battery_title">Download when not charging</string>
<string name="pref_automatic_download_on_battery_sum">Allow automatic download when the battery is not charging</string>
- <string name="pref_parallel_downloads_title">Parallel downloads</string>
- <string name="pref_episode_cache_title">Episode cache</string>
+ <string name="pref_parallel_downloads_title">Parallel Downloads</string>
+ <string name="pref_episode_cache_title">Episode Cache</string>
<string name="pref_theme_title_light">Light</string>
<string name="pref_theme_title_dark">Dark</string>
<string name="pref_episode_cache_unlimited">Unlimited</string>
@@ -301,14 +305,14 @@
<string name="pref_gpodnet_sethostname_use_default_host">Use default host</string>
<string name="pref_expandNotify_title">Expand Notification</string>
<string name="pref_expandNotify_sum">Always expand the notification to show playback buttons.</string>
- <string name="pref_persistNotify_title">Persistent playback controls</string>
+ <string name="pref_persistNotify_title">Persistent Playback Controls</string>
<string name="pref_persistNotify_sum">Keep notification and lockscreen controls when playback is paused.</string>
<string name="pref_showDownloadReport_title">Show Download Report</string>
<string name="pref_showDownloadReport_sum">If downloads fail, generate a report that shows the details of the failure.</string>
<string name="pref_expand_notify_unsupport_toast">Android versions before 4.1 do not support expanded notifications.</string>
<string name="pref_queueAddToFront_sum">Add new episodes to the front of the queue.</string>
- <string name="pref_queueAddToFront_title">Enqueue at front.</string>
+ <string name="pref_queueAddToFront_title">Enqueue at Front</string>
<string name="pref_smart_mark_as_played_disabled">Disabled</string>
@@ -331,7 +335,7 @@
<string name="opml_import_explanation_1">Choose a specific file path from the local filesystem.</string>
<string name="opml_import_explanation_2">Use an external applications like Dropbox, Google Drive or your favourite file manager to open an OPML file.</string>
<string name="opml_import_explanation_3">Many applications like Google Mail, Dropbox, Google Drive and most file managers can <i>open</i> OPML files <i>with</i> AntennaPod.</string> <string name="start_import_label">Start import</string>
- <string name="opml_import_label">OPML import</string>
+ <string name="opml_import_label">OPML Import</string>
<string name="opml_directory_error">ERROR!</string>
<string name="reading_opml_label">Reading OPML file</string>
<string name="opml_reader_error">An error has occurred while reading the opml document:</string>
@@ -343,7 +347,7 @@
<string name="opml_export_label">OPML export</string>
<string name="exporting_label">Exporting...</string>
<string name="export_error_label">Export error</string>
- <string name="opml_export_success_title">OPML export successful.</string>
+ <string name="opml_export_success_title">OPML Export successful.</string>
<string name="opml_export_success_sum">The .opml file was written to:\u0020</string>
<!-- Sleep timer -->
@@ -391,7 +395,7 @@
<!-- Directory chooser -->
<string name="selected_folder_label">Selected folder:</string>
<string name="create_folder_label">Create folder</string>
- <string name="choose_data_directory">Choose data folder</string>
+ <string name="choose_data_directory">Choose Data Folder</string>
<string name="create_folder_msg">Create new folder with name "%1$s"?</string>
<string name="create_folder_success">Created new folder</string>
<string name="create_folder_error_no_write_access">Cannot write to this folder</string>
@@ -401,9 +405,9 @@
<string name="folder_not_empty_dialog_msg">The folder you have selected is not empty. Media downloads and other files will be placed directly in this folder. Continue anyway?</string>
<string name="set_to_default_folder">Choose default folder</string>
<string name="pref_pausePlaybackForFocusLoss_sum">Pause playback instead of lowering volume when another app wants to play sounds</string>
- <string name="pref_pausePlaybackForFocusLoss_title">Pause for interruptions</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">Pause for Interruptions</string>
<string name="pref_resumeAfterCall_sum">Resume playback after a phone call completes</string>
- <string name="pref_resumeAfterCall_title">Resume after call</string>
+ <string name="pref_resumeAfterCall_title">Resume after Call</string>
<!-- Online feed view -->
<string name="subscribe_label">Subscribe</string>
@@ -434,6 +438,10 @@
<string name="authentication_label">Authentication</string>
<string name="authentication_descr">Change your username and password for this podcast and its episodes.</string>
+
+ <!-- Progress information -->
+ <string name="progress_upgrading_database">Upgrading the database</string>
+
<!-- AntennaPodSP -->
<string name="sp_apps_importing_feeds_msg">Importing subscriptions from single-purpose apps&#8230;</string>