diff options
30 files changed, 486 insertions, 129 deletions
@@ -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…</string> |