summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java192
-rw-r--r--core/src/main/res/values-fr/strings.xml54
-rw-r--r--core/src/main/res/values-lt/strings.xml39
-rw-r--r--core/src/main/res/values-ru/strings.xml5
4 files changed, 183 insertions, 107 deletions
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 bde63884a..7bb727d68 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
@@ -15,9 +15,12 @@ import android.text.TextUtils;
import android.util.Log;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.event.ProgressEvent;
@@ -40,7 +43,7 @@ import de.greenrobot.event.EventBus;
* Implements methods for accessing the database
*/
public class PodDBAdapter {
-
+
private static final String TAG = "PodDBAdapter";
private static final String DATABASE_NAME = "Antennapod.db";
@@ -219,7 +222,7 @@ public class PodDBAdapter {
public static final String CREATE_TABLE_FAVORITES = "CREATE TABLE "
+ TABLE_NAME_FAVORITES + "(" + KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_FEEDITEM + " INTEGER," + KEY_FEED + " INTEGER)";
-
+
/**
* Select all columns from the feed-table
*/
@@ -252,7 +255,7 @@ public class PodDBAdapter {
TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER,
TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER
};
-
+
/**
* Select all columns from the feeditems-table except description and
* content-encoded.
@@ -303,59 +306,87 @@ public class PodDBAdapter {
private static final String[] SEL_FI_EXTRA = {KEY_ID, KEY_DESCRIPTION,
KEY_CONTENT_ENCODED, KEY_FEED};
-
- private static SQLiteDatabase db;
private static Context context;
private static PodDBHelper dbHelper;
+
+ private static volatile SQLiteDatabase db;
+ private static Lock dbLock = new ReentrantLock();
private static AtomicInteger counter = new AtomicInteger(0);
public static void init(Context context) {
PodDBAdapter.context = context.getApplicationContext();
}
- public static synchronized PodDBAdapter getInstance() {
- if(dbHelper == null) {
- dbHelper = new PodDBHelper(PodDBAdapter.context, DATABASE_NAME, null);
- }
+ private static class PodDBHelperholder {
+ public static final PodDBHelper dbHelper = new PodDBHelper(PodDBAdapter.context, DATABASE_NAME, null);
+ }
+
+ public static PodDBAdapter getInstance() {
+ dbHelper = PodDBHelperholder.dbHelper;
return new PodDBAdapter();
}
- private PodDBAdapter() {}
+ private PodDBAdapter() {
+ }
- public synchronized PodDBAdapter open() {
+ public PodDBAdapter open() {
int adapters = counter.incrementAndGet();
Log.v(TAG, "Opening DB #" + adapters);
- if (db == null || !db.isOpen() || db.isReadOnly()) {
+
+ if ((db == null) || (!db.isOpen()) || (db.isReadOnly())) {
try {
- db = dbHelper.getWritableDatabase();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- db.enableWriteAheadLogging();
+ dbLock.lock();
+ if ((db == null) || (!db.isOpen()) || (db.isReadOnly())) {
+ db = openDb();
}
- } catch (SQLException ex) {
- Log.e(TAG, Log.getStackTraceString(ex));
- db = dbHelper.getReadableDatabase();
+ } finally {
+ dbLock.unlock();
}
}
return this;
}
- public synchronized void close() {
+ private SQLiteDatabase openDb() {
+ SQLiteDatabase newDb = null;
+ try {
+ newDb = dbHelper.getWritableDatabase();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ newDb.enableWriteAheadLogging();
+ }
+ } catch (SQLException ex) {
+ Log.e(TAG, Log.getStackTraceString(ex));
+ newDb = dbHelper.getReadableDatabase();
+ }
+ return newDb;
+ }
+
+ public void close() {
int adapters = counter.decrementAndGet();
Log.v(TAG, "Closing DB #" + adapters);
- if(adapters == 0) {
+
+ if (adapters == 0) {
Log.v(TAG, "Closing DB, really");
- db.close();
+ try {
+ dbLock.lock();
+ db.close();
+ db = null;
+ } finally {
+ dbLock.unlock();
+ }
}
}
public static boolean deleteDatabase() {
PodDBAdapter adapter = getInstance();
adapter.open();
- for (String tableName : ALL_TABLES) {
- db.delete(tableName, "1", null);
+ try {
+ for (String tableName : ALL_TABLES) {
+ db.delete(tableName, "1", null);
+ }
+ return true;
+ } finally {
+ adapter.close();
}
- adapter.close();
- return true;
}
/**
@@ -390,8 +421,8 @@ public class PodDBAdapter {
values.put(KEY_FLATTR_STATUS, feed.getFlattrStatus().toLong());
values.put(KEY_IS_PAGED, feed.isPaged());
values.put(KEY_NEXT_PAGE_LINK, feed.getNextPageLink());
- if(feed.getItemFilter() != null && feed.getItemFilter().getValues().length > 0) {
- values.put(KEY_HIDE, TextUtils.join( ",", feed.getItemFilter().getValues()));
+ if (feed.getItemFilter() != null && feed.getItemFilter().getValues().length > 0) {
+ values.put(KEY_HIDE, TextUtils.join(",", feed.getItemFilter().getValues()));
} else {
values.put(KEY_HIDE, "");
}
@@ -415,7 +446,7 @@ public class PodDBAdapter {
ContentValues values = new ContentValues();
values.put(KEY_AUTO_DOWNLOAD, prefs.getAutoDownload());
values.put(KEY_KEEP_UPDATED, prefs.getKeepUpdated());
- values.put(KEY_AUTO_DELETE_ACTION,prefs.getAutoDeleteAction().ordinal());
+ values.put(KEY_AUTO_DELETE_ACTION, prefs.getAutoDeleteAction().ordinal());
values.put(KEY_USERNAME, prefs.getUsername());
values.put(KEY_PASSWORD, prefs.getPassword());
values.put(KEY_INCLUDE_FILTER, prefs.getFilter().getIncludeFilter());
@@ -424,10 +455,11 @@ public class PodDBAdapter {
}
public void setFeedItemFilter(long feedId, Set<String> filterValues) {
- Log.d(TAG, "setFeedItemFilter() called with: " + "feedId = [" + feedId + "], " +
- "filterValues = [" + TextUtils.join(",", filterValues) + "]");
+ String valuesList = TextUtils.join(",", filterValues);
+ Log.d(TAG, String.format(
+ "setFeedItemFilter() called with: feedId = [%d], filterValues = [%s]", feedId, valuesList));
ContentValues values = new ContentValues();
- values.put(KEY_HIDE, TextUtils.join(",", filterValues));
+ values.put(KEY_HIDE, valuesList);
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(feedId)});
}
@@ -458,7 +490,7 @@ public class PodDBAdapter {
image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values));
} else {
db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?",
- new String[]{String.valueOf(image.getId())});
+ new String[]{String.valueOf(image.getId())});
}
final FeedComponent owner = image.getOwner();
@@ -746,9 +778,9 @@ public class PodDBAdapter {
setFeed(item.getFeed());
}
values.put(KEY_FEED, item.getFeed().getId());
- if(item.isNew()) {
+ if (item.isNew()) {
values.put(KEY_READ, FeedItem.NEW);
- } else if(item.isPlayed()) {
+ } else if (item.isPlayed()) {
values.put(KEY_READ, FeedItem.PLAYED);
} else {
values.put(KEY_READ, FeedItem.UNPLAYED);
@@ -808,7 +840,8 @@ public class PodDBAdapter {
/**
* Sets the 'read' attribute of the item.
- * @param read must be one of FeedItem.PLAYED, FeedItem.NEW, FeedItem.UNPLAYED
+ *
+ * @param read must be one of FeedItem.PLAYED, FeedItem.NEW, FeedItem.UNPLAYED
* @param itemIds items to change the value of
*/
public void setFeedItemRead(int read, long... itemIds) {
@@ -851,8 +884,8 @@ public class PodDBAdapter {
public void setFeedLastUpdateFailed(long feedId, boolean failed) {
final String sql = "UPDATE " + TABLE_NAME_FEEDS
- + " SET " + KEY_LAST_UPDATE_FAILED+ "=" + (failed ? "1" : "0")
- + " WHERE " + KEY_ID + "="+ feedId;
+ + " SET " + KEY_LAST_UPDATE_FAILED + "=" + (failed ? "1" : "0")
+ + " WHERE " + KEY_ID + "=" + feedId;
db.execSQL(sql);
}
@@ -892,7 +925,7 @@ public class PodDBAdapter {
public void setFeedsItemsAutoDownload(Feed feed, boolean autoDownload) {
final String sql = "UPDATE " + TABLE_NAME_FEED_ITEMS
- + " SET " + KEY_AUTO_DOWNLOAD + "="+ (autoDownload ? "1" : "0")
+ + " SET " + KEY_AUTO_DOWNLOAD + "=" + (autoDownload ? "1" : "0")
+ " WHERE " + KEY_FEED + "=" + feed.getId();
db.execSQL(sql);
}
@@ -994,8 +1027,8 @@ public class PodDBAdapter {
public void removeFeedMedia(FeedMedia media) {
// delete download log entries for feed media
- db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE +"=?",
- new String[] { String.valueOf(media.getId()), String.valueOf(FeedMedia.FEEDFILETYPE_FEEDMEDIA) });
+ db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
+ new String[]{String.valueOf(media.getId()), String.valueOf(FeedMedia.FEEDFILETYPE_FEEDMEDIA)});
db.delete(TABLE_NAME_FEED_MEDIA, KEY_ID + "=?",
new String[]{String.valueOf(media.getId())});
@@ -1048,10 +1081,10 @@ public class PodDBAdapter {
}
// delete download log entries for feed
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
- new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)});
+ new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)});
db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
- new String[]{String.valueOf(feed.getId())});
+ new String[]{String.valueOf(feed.getId())});
db.setTransactionSuccessful();
} catch (SQLException e) {
Log.e(TAG, Log.getStackTraceString(e));
@@ -1190,12 +1223,12 @@ public class PodDBAdapter {
* cursor uses the FEEDITEM_SEL_FI_SMALL selection.
*/
public final Cursor getQueueCursor() {
- Object[] args = new String[] {
+ Object[] args = new String[]{
SEL_FI_SMALL_STR,
TABLE_NAME_FEED_ITEMS, TABLE_NAME_QUEUE,
TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM,
- TABLE_NAME_QUEUE + "." + KEY_ID };
+ TABLE_NAME_QUEUE + "." + KEY_ID};
String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args);
return db.rawQuery(query, null);
}
@@ -1206,12 +1239,12 @@ public class PodDBAdapter {
public final Cursor getFavoritesCursor() {
- Object[] args = new String[] {
+ Object[] args = new String[]{
SEL_FI_SMALL_STR,
TABLE_NAME_FEED_ITEMS, TABLE_NAME_FAVORITES,
TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
TABLE_NAME_FAVORITES + "." + KEY_FEEDITEM,
- TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE };
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE};
String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s DESC", args);
return db.rawQuery(query, null);
}
@@ -1239,10 +1272,10 @@ public class PodDBAdapter {
public void setFeedItems(int oldState, int newState, long feedId) {
String sql = "UPDATE " + TABLE_NAME_FEED_ITEMS + " SET " + KEY_READ + "=" + newState;
- if(feedId > 0) {
+ if (feedId > 0) {
sql += " WHERE " + KEY_FEED + "=" + feedId;
}
- if(FeedItem.NEW <= oldState && oldState <= FeedItem.PLAYED) {
+ if (FeedItem.NEW <= oldState && oldState <= FeedItem.PLAYED) {
sql += feedId > 0 ? " AND " : " WHERE ";
sql += KEY_READ + "=" + oldState;
}
@@ -1268,7 +1301,7 @@ public class PodDBAdapter {
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
*/
public final Cursor getNewItemsCursor() {
- Object[] args = new String[] {
+ Object[] args = new String[]{
SEL_FI_SMALL_STR,
TABLE_NAME_FEED_ITEMS,
TABLE_NAME_FEEDS,
@@ -1302,7 +1335,7 @@ public class PodDBAdapter {
* @throws IllegalArgumentException if limit < 0
*/
public final Cursor getCompletedMediaCursor(int limit) {
- if(limit < 0) {
+ if (limit < 0) {
throw new IllegalArgumentException("Limit must be >= 0");
}
@@ -1359,11 +1392,10 @@ public class PodDBAdapter {
if (size == 1) {
return "(?)";
}
- StringBuilder builder = new StringBuilder("(");
- for (int i = 0; i < size - 1; i++) {
- builder.append("?,");
- }
- builder.append("?)");
+ StringBuilder builder =
+ new StringBuilder("(")
+ .append(TextUtils.join(",", Collections.nCopies(size, "?")))
+ .append(")");
return builder.toString();
}
@@ -1397,7 +1429,7 @@ public class PodDBAdapter {
+ " INNER JOIN " + TABLE_NAME_FEEDS
+ " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " INNER JOIN " + TABLE_NAME_FEED_MEDIA
- + " ON " + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM + "=" + TABLE_NAME_FEED_ITEMS + "." + KEY_ID
+ + " ON " + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM + "=" + TABLE_NAME_FEED_ITEMS + "." + KEY_ID
+ " WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_URL + "=" + escapedEpisodeUrl
+ " AND " + TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL + "=" + escapedPodcastUrl;
Log.d(TAG, "SQL: " + query);
@@ -1448,10 +1480,10 @@ public class PodDBAdapter {
public final LongIntMap getFeedCounters(long... feedIds) {
int setting = UserPreferences.getFeedCounterSetting();
String whereRead;
- switch(setting) {
+ switch (setting) {
case UserPreferences.FEED_COUNTER_SHOW_NEW_UNPLAYED_SUM:
whereRead = "(" + KEY_READ + "=" + FeedItem.NEW +
- " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")";
+ " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")";
break;
case UserPreferences.FEED_COUNTER_SHOW_NEW:
whereRead = KEY_READ + "=" + FeedItem.NEW;
@@ -1497,7 +1529,7 @@ public class PodDBAdapter {
long feedId = c.getLong(0);
int count = c.getInt(1);
result.put(feedId, count);
- } while(c.moveToNext());
+ } while (c.moveToNext());
}
c.close();
return result;
@@ -1605,8 +1637,8 @@ public class PodDBAdapter {
if (feedID != 0) {
// search items in specific feed
return db.rawQuery("SELECT " + TextUtils.join(", ", FEEDITEM_SEL_FI_SMALL) + " FROM " + TABLE_NAME_FEED_ITEMS
- + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS+"."+KEY_FEED+"="+TABLE_NAME_FEEDS+"."+KEY_ID
- + " WHERE " + KEY_FEED
+ + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ + " WHERE " + KEY_FEED
+ "=? AND " + KEY_AUTHOR + " LIKE '%"
+ prepareSearchQuery(query) + "%' ORDER BY "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " DESC",
@@ -1615,7 +1647,7 @@ public class PodDBAdapter {
} else {
// search through all items
return db.rawQuery("SELECT " + TextUtils.join(", ", FEEDITEM_SEL_FI_SMALL) + " FROM " + TABLE_NAME_FEED_ITEMS
- + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS+"."+KEY_FEED+"="+TABLE_NAME_FEEDS+"."+KEY_ID
+ + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " WHERE " + KEY_AUTHOR + " LIKE '%"
+ prepareSearchQuery(query) + "%' ORDER BY "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " DESC",
@@ -1628,7 +1660,7 @@ public class PodDBAdapter {
if (feedID != 0) {
// search items in specific feed
return db.rawQuery("SELECT " + TextUtils.join(", ", FEEDITEM_SEL_FI_SMALL) + " FROM " + TABLE_NAME_FEED_ITEMS
- + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS+"."+KEY_FEED+"="+TABLE_NAME_FEEDS+"."+KEY_ID
+ + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " WHERE " + KEY_FEED
+ "=? AND " + KEY_FEED_IDENTIFIER + " LIKE '%"
+ prepareSearchQuery(query) + "%' ORDER BY "
@@ -1638,7 +1670,7 @@ public class PodDBAdapter {
} else {
// search through all items
return db.rawQuery("SELECT " + TextUtils.join(", ", FEEDITEM_SEL_FI_SMALL) + " FROM " + TABLE_NAME_FEED_ITEMS
- + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS+"."+KEY_FEED+"="+TABLE_NAME_FEEDS+"."+KEY_ID
+ + " JOIN " + TABLE_NAME_FEEDS + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " WHERE " + KEY_FEED_IDENTIFIER + " LIKE '%"
+ prepareSearchQuery(query) + "%' ORDER BY "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + " DESC",
@@ -1842,7 +1874,7 @@ public class PodDBAdapter {
KEY_LINK,
KEY_CHAPTER_TYPE));
}
- if(oldVersion <= 14) {
+ if (oldVersion <= 14) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " ADD COLUMN " + KEY_AUTO_DOWNLOAD + " INTEGER");
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
@@ -1865,7 +1897,7 @@ public class PodDBAdapter {
db.execSQL(PodDBAdapter.CREATE_INDEX_QUEUE_FEEDITEM);
db.execSQL(PodDBAdapter.CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM);
}
- if(oldVersion <= 15) {
+ if (oldVersion <= 15) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " ADD COLUMN " + KEY_HAS_EMBEDDED_PICTURE + " INTEGER DEFAULT -1");
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
@@ -1875,7 +1907,7 @@ public class PodDBAdapter {
+ " FROM " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " WHERE " + KEY_DOWNLOADED + "=1 "
+ " AND " + KEY_HAS_EMBEDDED_PICTURE + "=-1", null);
- if(c.moveToFirst()) {
+ if (c.moveToFirst()) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
do {
String fileUrl = c.getString(0);
@@ -1885,20 +1917,20 @@ public class PodDBAdapter {
if (image != null) {
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " SET " + KEY_HAS_EMBEDDED_PICTURE + "=1"
- + " WHERE " + KEY_FILE_URL + "='"+ fileUrl + "'");
+ + " WHERE " + KEY_FILE_URL + "='" + fileUrl + "'");
} else {
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " SET " + KEY_HAS_EMBEDDED_PICTURE + "=0"
- + " WHERE " + KEY_FILE_URL + "='"+ fileUrl + "'");
+ + " WHERE " + KEY_FILE_URL + "='" + fileUrl + "'");
}
- } catch(Exception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
- } while(c.moveToNext());
+ } while (c.moveToNext());
}
c.close();
}
- if(oldVersion <= 16) {
+ if (oldVersion <= 16) {
String selectNew = "SELECT " + PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + KEY_ID
+ " FROM " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " INNER JOIN " + PodDBAdapter.TABLE_NAME_FEED_MEDIA + " ON "
@@ -1912,29 +1944,29 @@ public class PodDBAdapter {
+ PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " = 0 AND " // undownloaded
+ PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + " = 0 AND " // not partially played
+ PodDBAdapter.TABLE_NAME_QUEUE + "." + KEY_ID + " IS NULL"; // not in queue
- String sql = "UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ String sql = "UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS
+ " SET " + KEY_READ + "=" + FeedItem.NEW
+ " WHERE " + KEY_ID + " IN (" + selectNew + ")";
Log.d("Migration", "SQL: " + sql);
db.execSQL(sql);
}
- if(oldVersion <= 17) {
+ if (oldVersion <= 17) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
+ " ADD COLUMN " + PodDBAdapter.KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0");
}
- if(oldVersion < 1030005) {
+ if (oldVersion < 1030005) {
db.execSQL("UPDATE FeedItems SET auto_download=0 WHERE " +
"(read=1 OR id IN (SELECT feeditem FROM FeedMedia WHERE position>0 OR downloaded=1)) " +
"AND id NOT IN (SELECT feeditem FROM Queue)");
}
- if(oldVersion < 1040001) {
+ if (oldVersion < 1040001) {
db.execSQL(CREATE_TABLE_FAVORITES);
}
- if (oldVersion < 1040002) {
+ if (oldVersion < 1040002) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " ADD COLUMN " + PodDBAdapter.KEY_LAST_PLAYED_TIME + " INTEGER DEFAULT 0");
}
- if(oldVersion < 1040013) {
+ if (oldVersion < 1040013) {
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_PUBDATE);
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_READ);
}
@@ -1988,9 +2020,9 @@ public class PodDBAdapter {
if (oldVersion < 1050004) {
// prevent old timestamps to be misinterpreted as ETags
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEEDS
- +" SET " + PodDBAdapter.KEY_LASTUPDATE + "=NULL");
+ + " SET " + PodDBAdapter.KEY_LASTUPDATE + "=NULL");
}
- if(oldVersion < 1060200) {
+ if (oldVersion < 1060200) {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
+ " ADD COLUMN " + PodDBAdapter.KEY_CUSTOM_TITLE + " TEXT");
}
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index b460eaef7..33e07010a 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -20,14 +20,14 @@
<string name="playback_history_label">Journal des lectures</string>
<string name="gpodnet_main_label">gpodder.net</string>
<string name="gpodnet_auth_label">Identifiants gpodder.net</string>
- <string name="free_space_label">%1$s d\'espace libre</string>
+ <string name="free_space_label">%1$s d\\'espace libre</string>
<string name="episode_cache_full_title">L\'emplacement pour stocker les épisodes est plein</string>
<string name="episode_cache_full_message">Le nombre maximal d\'épisodes téléchargés a été atteint. Vous pouvez changer ce nombre dans les paramètres.</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Temps d\'écoute total</string>
<string name="statistics_details_dialog">%1$d épisodes sur %2$d commencés.\n\nLu %3$s sur %4$s.</string>
<string name="statistics_mode">Type de statistiques</string>
- <string name="statistics_mode_normal">Calculer la durée réellement écoutée. Les épisodes écoutés deux fois comptent double alors que ceux simplement marqués lu ne sont pas comptés</string>
+ <string name="statistics_mode_normal">Calculer la durée réellement écoutée. Les épisodes écoutés deux fois comptent double alors que ceux simplement marqués lus ne sont pas comptés</string>
<string name="statistics_mode_count_all">Additionner tous les podcasts marqués comme lus</string>
<string name="statistics_speed_not_counted">Note : la vitesse de lecture n\'est jamais prise en compte.</string>
<!--Main activity-->
@@ -37,7 +37,7 @@
<string name="drawer_feed_order_unplayed_episodes">Trier par compteur</string>
<string name="drawer_feed_order_alphabetical">Trier alphabétiquement</string>
<string name="drawer_feed_order_last_update">Trier par date de publication</string>
- <string name="drawer_feed_order_most_played">Trier selon le nombre d\'épisodes</string>
+ <string name="drawer_feed_order_most_played">Trier par nombre d\'épisodes lus</string>
<string name="drawer_feed_counter_new_unplayed">Nombre de nouveaux épisodes non-lus</string>
<string name="drawer_feed_counter_new">Nombre de nouveaux épisodes</string>
<string name="drawer_feed_counter_unplayed">Nombre d\'épisodes non-lus</string>
@@ -56,7 +56,7 @@
<string name="cancel_label">Annuler</string>
<string name="yes">Oui</string>
<string name="no">Non</string>
- <string name="reset">Reset</string>
+ <string name="reset">Réinitialiser</string>
<string name="author_label">Auteur</string>
<string name="language_label">Langue</string>
<string name="url_label">URL</string>
@@ -65,7 +65,7 @@
<string name="error_label">Erreur</string>
<string name="error_msg_prefix">Une erreur a eu lieu :</string>
<string name="refresh_label">Rafraîchir</string>
- <string name="external_storage_error_msg">Aucun stockage externe n\'est disponible. Merci de connecter un volume de stockage externe pour que l\'application puisse fonctionner correctement.</string>
+ <string name="external_storage_error_msg">Aucun stockage externe n\\'est disponible. Merci de connecter un volume de stockage externe pour que l\\'application puisse fonctionner correctement.</string>
<string name="chapters_label">Chapitres</string>
<string name="chapter_duration">Durée : %1$s</string>
<string name="shownotes_label">Notes d\'épisode</string>
@@ -117,8 +117,8 @@
<string name="share_link_label">Partager un lien vers le site</string>
<string name="share_link_with_position_label">Partager lien avec position</string>
<string name="share_feed_url_label">Partager lien du flux</string>
- <string name="share_item_url_label">Partager le lien de l\'épisode</string>
- <string name="share_item_url_with_position_label">Partager le lien de l\'épisode avec la position</string>
+ <string name="share_item_url_label">Partager le lien de l\\'épisode</string>
+ <string name="share_item_url_with_position_label">Partager le lien de l\\'épisode avec la position</string>
<string name="feed_delete_confirmation_msg">Confirmer que vous voulez supprimer le flux \"%1$s\" et TOUS les épisodes que vous avez téléchargés.</string>
<string name="feed_remover_msg">Flux en cours de suppression</string>
<string name="load_complete_feed">Mettre à jour tout le flux</string>
@@ -127,8 +127,8 @@
<string name="hide_unplayed_episodes_label">Non joués</string>
<string name="hide_paused_episodes_label">En pause</string>
<string name="hide_played_episodes_label">Joués</string>
- <string name="hide_queued_episodes_label">Rajouté à la liste d\'attente</string>
- <string name="hide_not_queued_episodes_label">Pas rajouté à la liste d\'attente</string>
+ <string name="hide_queued_episodes_label">Rajouté à la liste d\\'attente</string>
+ <string name="hide_not_queued_episodes_label">Non rajouté à la liste d\\'attente</string>
<string name="hide_downloaded_episodes_label">Téléchargé</string>
<string name="hide_not_downloaded_episodes_label">Non téléchargé</string>
<string name="hide_has_media_label">À des médias</string>
@@ -144,7 +144,7 @@
<string name="remove_label">Supprimer</string>
<string name="delete_label">Effacer</string>
<string name="remove_episode_lable">Supprimer cet épisode</string>
- <string name="marked_as_seen_label">Marquer comme vu</string>
+ <string name="marked_as_seen_label">Marqué comme vu</string>
<string name="mark_read_label">Marquer comme lu</string>
<string name="marked_as_read_label">Les épisodes ont été marqués comme lus</string>
<string name="mark_unread_label">Marquer comme non lu</string>
@@ -287,14 +287,14 @@
<string name="pref_pauseOnDisconnect_sum">Interrompre la lecture lorsque le casque ou le bluetooth sont déconnectés</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Reprendre la lecture quand les écouteurs sont reconnectés</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Reprendre la lecture quand le Bluetooth se reconnecte</string>
- <string name="pref_hardwareForwardButtonSkips_title">Le bouton saut avant saute l\'épisode</string>
- <string name="pref_hardwareForwardButtonSkips_sum">Passer à l\'épisode suivant au lieu de faire un saut avant quand un bouton physique \"saut avant\" est pressé</string>
- <string name="pref_hardwarePreviousButtonRestarts_title">Bouton précédent redémarre</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Le bouton \"saut avant\" saute l\'épisode</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Passer à l\\'épisode suivant au lieu de faire un saut avant quand un bouton physique \\"saut avant\\" est pressé</string>
+ <string name="pref_hardwarePreviousButtonRestarts_title">Le bouton \"saut arrière\" redémarre l\'épisode</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Repartir de zéro au lieu de faire un saut arrière quand un bouton physique \"saut arrière\" est pressé</string>
<string name="pref_followQueue_sum">Après la fin d\'un épisode, passer au suivant</string>
<string name="pref_auto_delete_sum">Supprimer l\'épisode quand la lecture est finie</string>
<string name="pref_auto_delete_title">Suppression automatique</string>
- <string name="pref_smart_mark_as_played_sum">Marquer les épisodes comme lus même s\'il reste encore un certain nombre de secondes à jouer</string>
+ <string name="pref_smart_mark_as_played_sum">Les épisodes seront marqués comme lus même s\'il reste quelques secondes à jouer</string>
<string name="pref_smart_mark_as_played_title">Marquer comme lu intelligemment</string>
<string name="pref_skip_keeps_episodes_sum">Garder les épisodes quand ils sont passés</string>
<string name="pref_skip_keeps_episodes_title">Garder les épisodes passés</string>
@@ -302,7 +302,7 @@
<string name="network_pref">Réseau</string>
<string name="pref_autoUpdateIntervallOrTime_title">Mettre à jour l’intervalle ou l\'heure</string>
<string name="pref_autoUpdateIntervallOrTime_sum">Indiquer un intervalle ou une heure spécifique de mise à jour des flux</string>
- <string name="pref_autoUpdateIntervallOrTime_message">Vous pouvez mettre en place un <i>intervalle</i> comme \"toutes les 2 heures\", une <i>heure précise</i> comme \"7:00\" ou désactiver les mises à jours automatique.\n\n<small>Note: Il est possible qu\'il y ait un délai car l\'heure de mise à jour peut être inexacte.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Vous pouvez mettre en place un <i>intervalle</i> comme \\"toutes les 2 heures\\", une <i>heure précise</i> comme \\"7:00\\" ou désactiver les mises à jours automatique.\n\n<small>Note: Il est possible qu\\'il y ait un délai car l\\'heure de mise à jour peut être inexacte.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Désactiver</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Définir intervalle</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Régler l\'heure</string>
@@ -368,15 +368,15 @@
<string name="pref_gpodnet_notifications_title">Notification des erreurs de synchronisation</string>
<string name="pref_gpodnet_notifications_sum">Ce paramètre ne s\'applique pas aux erreurs d\'authentification.</string>
<string name="pref_playback_speed_title">Vitesses de lecture</string>
- <string name="pref_playback_speed_sum">Modifier la liste des vitesses disponibles pour la lecture audio</string>
+ <string name="pref_playback_speed_sum">Définir les vitesses disponibles lors de la lecture audio</string>
<string name="pref_fast_forward">Durée du saut avant</string>
- <string name="pref_fast_forward_sum">Régler le nombre de secondes à sauter quand le bouton \"saut avant\" est cliqué</string>
+ <string name="pref_fast_forward_sum">Nombre de secondes à sauter quand le bouton \"saut avant\" est cliqué</string>
<string name="pref_rewind">Durée du saut arrière</string>
- <string name="pref_rewind_sum">Régler le nombre de secondes à sauter quand le bouton \"saut arrière\" est cliqué</string>
+ <string name="pref_rewind_sum">Nombre de secondes à sauter quand le bouton \"saut arrière\" est cliqué</string>
<string name="pref_gpodnet_sethostname_title">Choisir un nom de domaine</string>
<string name="pref_gpodnet_sethostname_use_default_host">Utiliser le nom de domaine par défaut</string>
<string name="pref_expandNotify_title">Etendre la notification</string>
- <string name="pref_expandNotify_sum">Toujours étendre les notifications pour montrer les boutons de lecture</string>
+ <string name="pref_expandNotify_sum">Toujours étendre la notification pour montrer tous les boutons de lecture </string>
<string name="pref_persistNotify_title">Boutons de lecture permanents</string>
<string name="pref_persistNotify_sum">Garder les notifications et les boutons de lecture sur l\'écran de verouillage quand la lecture est en pause</string>
<string name="pref_compact_notification_buttons_title">Définir les boutons de l\'écran de verrouillage</string>
@@ -388,7 +388,7 @@
<string name="pref_showDownloadReport_title">Afficher le rapport de téléchargements</string>
<string name="pref_showDownloadReport_sum">Si les téléchargements échouent, générer un rapport des détails des échecs.</string>
<string name="pref_expand_notify_unsupport_toast">Les versions d\'Android antérieures à 4.1 ne sont pas compatibles avec les notifications élargies</string>
- <string name="pref_queueAddToFront_sum">Ajouter de nouveaux épisodes en tête de file</string>
+ <string name="pref_queueAddToFront_sum">Ajouter les nouveaux épisodes au début de la liste de lecture.</string>
<string name="pref_queueAddToFront_title">Mettre au début de la file d\'attente</string>
<string name="pref_smart_mark_as_played_disabled">Désactivé</string>
<string name="pref_image_cache_size_title">Taille du cache de l\'image</string>
@@ -450,14 +450,14 @@
<string name="opml_export_success_sum">Le fichier .opml a été écrit ici :\u0020</string>
<string name="opml_import_ask_read_permission">L\'accès au stockage externe est requis pour lire le fichier OPML</string>
<!--Sleep timer-->
- <string name="set_sleeptimer_label">Définir le minuteur d\'arrêt automatique</string>
- <string name="disable_sleeptimer_label">Désactiver le minuteur d\'arrêt automatique</string>
+ <string name="set_sleeptimer_label">Activer le minuteur d\\'arrêt</string>
+ <string name="disable_sleeptimer_label">Désactiver le minuteur d\'arrêt</string>
<string name="enter_time_here_label">Entrer l\'heure</string>
- <string name="sleep_timer_label">Minuteur de mise en veille</string>
+ <string name="sleep_timer_label">Minuteur d\'arrêt</string>
<string name="time_left_label">Durée restante :\u0020</string>
<string name="time_dialog_invalid_input">Entrée invalide, la durée doit être un nombre entier</string>
- <string name="timer_about_to_expire_label"><b>Quand le minuteur est sur le point de se terminer:</b></string>
- <string name="shake_to_reset_label">Secouer afin de remettre le minuteur a zéro</string>
+ <string name="timer_about_to_expire_label"><b>Quand le minuteur se termine :</b></string>
+ <string name="shake_to_reset_label">Secouer pour redémarrer le minuteur</string>
<string name="timer_vibration_label">Vibrer</string>
<string name="time_seconds">secondes</string>
<string name="time_minutes">minutes</string>
@@ -525,7 +525,7 @@
<string name="folder_not_empty_dialog_title">Le répertoire n\'est pas vide</string>
<string name="folder_not_empty_dialog_msg">Le répertoire que vous avez choisi n\'est pas vide. Les fichiers téléchargés seront ajoutés à ce répertoire. Continuer malgré tout ?</string>
<string name="set_to_default_folder">Choisir le répertoire par défaut</string>
- <string name="pref_pausePlaybackForFocusLoss_sum">Mettre la lecture en pause au lieu de baisser le volume quand une autre application veut jouer un son</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Pauser la lecture au lieu de baisser le volume quand une autre application joue un son</string>
<string name="pref_pausePlaybackForFocusLoss_title">Mettre en pause lors d\'interruptions</string>
<string name="pref_resumeAfterCall_sum">Reprendre la lecture après un appel téléphonique</string>
<string name="pref_resumeAfterCall_title">Reprendre après appel</string>
@@ -536,7 +536,7 @@
<string name="downloading_label">En cours de téléchargement...</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Saut arrière</string>
- <string name="fast_forward_label">Avance rapide</string>
+ <string name="fast_forward_label">Saut avant</string>
<string name="media_type_audio_label">Audio</string>
<string name="media_type_video_label">Vidéo</string>
<string name="navigate_upwards_label">Naviguer vers le haut</string>
diff --git a/core/src/main/res/values-lt/strings.xml b/core/src/main/res/values-lt/strings.xml
index e720f88f4..7595d23e7 100644
--- a/core/src/main/res/values-lt/strings.xml
+++ b/core/src/main/res/values-lt/strings.xml
@@ -24,6 +24,7 @@
<string name="episode_cache_full_title">Epizodų podėlis pilnas</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Bendra perklausytų tinklalaidžių trukmė:</string>
+ <string name="statistics_mode">Statistikos režimas</string>
<!--Main activity-->
<string name="drawer_open">Atverti meniu</string>
<string name="drawer_close">Uždaryti meniu</string>
@@ -31,6 +32,7 @@
<string name="drawer_feed_order_unplayed_episodes">Rikiuoti pagal skaitliuko reikšmę</string>
<string name="drawer_feed_order_alphabetical">Rikiuoti pagal abėcėlę</string>
<string name="drawer_feed_order_last_update">Rikiuoti pagal publikavimo datą</string>
+ <string name="drawer_feed_order_most_played">Rikiuoti pagal perklausytų epizodų kiekį</string>
<string name="drawer_feed_counter_new_unplayed">Naujų, dar neperklausytų epizodų skaičius</string>
<string name="drawer_feed_counter_new">Naujų epizodų skaičius</string>
<string name="drawer_feed_counter_unplayed">Neperklausytų epizodų skaičius</string>
@@ -41,6 +43,7 @@
<string name="copy_url_label">Kopijuoti URL</string>
<string name="share_url_label">Dalintis URL</string>
<string name="copied_url_msg">URL nukopijuotas į iškarpinę</string>
+ <string name="go_to_position_label">Peršokti į šią poziciją</string>
<!--Playback history-->
<string name="clear_history_label">Išvalyti istoriją</string>
<!--Other-->
@@ -58,6 +61,7 @@
<string name="error_msg_prefix">Įvyko klaida:</string>
<string name="refresh_label">Atnaujinti</string>
<string name="chapters_label">Skyriai</string>
+ <string name="chapter_duration">Trukmė: %1$s</string>
<string name="shownotes_label">Laidos užrašai</string>
<string name="description_label">Aprašymas</string>
<string name="most_recent_prefix">Naujausias epizodas:\u0020</string>
@@ -74,15 +78,25 @@
<string name="feed_auto_download_never">Niekada</string>
<string name="send_label">Siųsti...</string>
<string name="episode_cleanup_never">Niekada</string>
+ <string name="episode_cleanup_queue_removal">Jei nėra eilėje</string>
<string name="episode_cleanup_after_listening">Pabaigus klausyti</string>
+ <plurals name="episode_cleanup_days_after_listening">
+ <item quantity="one">Praėjus dienai nuo perklausymo</item>
+ <item quantity="few">Praėjus %d dienoms nuo perklausymo</item>
+ <item quantity="other">Praėjus %d dienoms nuo perklausymo</item>
+ </plurals>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Sklaidos kanalo URL</string>
<string name="etxtFeedurlHint">www.example.com/feed</string>
<string name="txtvfeedurl_label">Pridėti tinklalaidę pagal URL adresą</string>
+ <string name="browse_gpoddernet_label">Naršyti gpodder.net svetainėje</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Pažymėti visus kaip perklausytus</string>
<string name="mark_all_read_msg">Visi epizodai pažymėti kaip perklausyti</string>
<string name="mark_all_read_confirmation_msg">Patvirtinkite, jog norite pažymėti visus epizodus kaip perklausytus.</string>
+ <string name="mark_all_seen_label">Pažymėti visus kaip matytus</string>
+ <string name="mark_all_seen_msg">Visi epizodai pažymėti kaip matyti</string>
+ <string name="mark_all_seen_confirmation_msg">Patvirtinkite, jog norite pažymėti visus epizodus kaip matytus.</string>
<string name="show_info_label">Rodyti informaciją</string>
<string name="rename_feed_label">Pervadinti tinklalaidę</string>
<string name="remove_feed_label">Pašalinti tinklalaidę</string>
@@ -91,6 +105,7 @@
<string name="share_feed_url_label">Dalintis sklaidos kanalo URL</string>
<string name="share_item_url_label">Dalintis epizodo failo URL</string>
<string name="feed_remover_msg">Šalinamas sklaidos kanalas</string>
+ <string name="load_complete_feed">Atnaujinti visą sklaidos kanalą</string>
<string name="hide_episodes_title">Slėpti epizodus</string>
<string name="episode_actions">Pritaikyti veiksmus</string>
<string name="hide_unplayed_episodes_label">Neperklausyti</string>
@@ -101,6 +116,7 @@
<string name="hide_downloaded_episodes_label">Atsiųsti</string>
<string name="hide_not_downloaded_episodes_label">Neatsiųsti</string>
<string name="hide_has_media_label">Turintys medijos failų</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} Paskutinis atnaujinimas nepavyko</string>
<string name="open_podcast">Atverti tinklalaidę</string>
<!--actions on feeditems-->
<string name="download_label">Atsisiųsti</string>
@@ -162,6 +178,7 @@
<string name="player_preparing_msg">Ruošiamasi</string>
<string name="player_ready_msg">Pasiruošęs</string>
<string name="playback_error_unknown">Nežinoma klaida</string>
+ <string name="no_media_playing_label">Atkūrimas nevyksta</string>
<string name="player_buffering_msg">Buferizuojama</string>
<string name="playbackservice_notification_title">Atkuriama tinklalaidė</string>
<!--Queue operations-->
@@ -170,6 +187,8 @@
<string name="queue_locked">Eilė užrakinta</string>
<string name="queue_unlocked">Eilė atrakinta</string>
<string name="clear_queue_label">Išvalyti eilę</string>
+ <string name="undo">Atšaukti</string>
+ <string name="removed_from_queue">Elementas pašalintas</string>
<string name="move_to_top_label">Perkelti į viršų</string>
<string name="move_to_bottom_label">Perkelti į apačią</string>
<string name="sort">Rikiuoti</string>
@@ -187,6 +206,7 @@
<string name="no_playback_plugin_title">Įskiepis neįdiegtas</string>
<string name="set_playback_speed_label">Atkūrimo spartos</string>
<!--Empty list labels-->
+ <string name="no_items_label">Šiame sąraše nėra elementų.</string>
<string name="no_feeds_label">Kol kas nesate užsiprenumeravę jokio sklaidos kanalo.</string>
<string name="no_shownotes_label">Šis epizodas neturi užrašų.</string>
<!--Preferences-->
@@ -202,6 +222,8 @@
<string name="pref_unpauseOnHeadsetReconnect_sum">Pratęsti atkūrimą, kai ausinės pakartotinai prijungiamos</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Pratęsti atkūrimą, kai pakartotinai prisijungiama prie „Bluetooth“</string>
<string name="pref_auto_delete_title">Automatinis trynimas</string>
+ <string name="pref_skip_keeps_episodes_sum">Palikti epizodus, kai šie praleidžiami</string>
+ <string name="pref_skip_keeps_episodes_title">Palikti praleistus epizodus</string>
<string name="playback_pref">Atkūrimas</string>
<string name="network_pref">Tinklas</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Ausinių atjungimas</string>
@@ -221,12 +243,22 @@
<string name="pref_update_interval_hours_manual">Rankinis</string>
<string name="pref_gpodnet_logout_title">Atsijungti</string>
<string name="pref_gpodnet_logout_toast">Sėkmingai atsijungta</string>
+ <string name="pref_gpodnet_setlogin_information_title">Keisti prisijungimo duomenis</string>
+ <string name="pref_gpodnet_sync_changes_title">Sinchronizuoti pakeitimus dabar</string>
+ <string name="pref_gpodnet_sync_started">Pradėtas sinchronizavimas</string>
+ <string name="pref_gpodnet_notifications_title">Rodyti sinchronizavimo klaidų pranešimus</string>
<string name="pref_gpodnet_notifications_sum">Šis nustatymas negalioja autentifikacijos klaidoms.</string>
<string name="pref_playback_speed_title">Atkūrimo sparta</string>
<string name="pref_playback_speed_sum">Pasirinkite prieinamas garso atkūrimo spartas</string>
+ <string name="pref_persistNotify_sum">Pristabdžius atkūrimą palikti valdiklius ekrano užrakte bei programų pranešimuose. </string>
+ <string name="pref_compact_notification_buttons_title">Nustatyti ekrano užrakto mygtukus</string>
+ <string name="pref_compact_notification_buttons_sum">Keisti ekrano užrakte matomus atkūrimo valdymo mygtukus. Atkūrimo/pristabdymo mygtukas matomas visada.</string>
+ <string name="pref_lockscreen_background_title">Nustatyti ekrano užrakto foną</string>
+ <string name="pref_lockscreen_background_sum">Atkuriamo epizodo paveikslėlį naudoti kaip ekrano užrakto foną. Paveikslėlis taip pat bus matomas trečiųjų šalių programėlėse.</string>
<string name="pref_showDownloadReport_title">Rodyti atsiuntimų ataskaitą</string>
<string name="pref_queueAddToFront_sum">Naujus epizodus dėti į eilės priekį.</string>
<string name="pref_queueAddToFront_title">Dėti į eilės priekį</string>
+ <string name="pref_smart_mark_as_played_disabled">Išjungtas</string>
<string name="pref_image_cache_size_title">Paveikslėlių podėlio dydis</string>
<string name="pref_image_cache_size_sum">Paveikslėlių podėlio diske dydis.</string>
<string name="send_email">Siųsti el. laišką</string>
@@ -252,8 +284,14 @@
<string name="exporting_label">Eksportuojama...</string>
<string name="export_error_label">Eksporto klaida</string>
<!--Sleep timer-->
+ <string name="set_sleeptimer_label">Nustatyti miego laikmatį</string>
+ <string name="disable_sleeptimer_label">Išjungti miego laikmatį</string>
+ <string name="sleep_timer_label">Miego laikmatis</string>
+ <string name="sleep_timer_enabled_label">Miego laikmatis įjungtas</string>
+ <string name="sleep_timer_disabled_label">Miego laikmatis išjungtas</string>
<!--gpodder.net-->
<string name="gpodnet_search_hint">Ieškoti gpodder.net svetainėje</string>
+ <string name="gpodnetauth_login_butLabel">Prisijungti</string>
<string name="username_label">Vartotojo vardas</string>
<string name="password_label">Slaptažodis</string>
<string name="gpodnetauth_finish_title">Sėkmingai prisijungta!</string>
@@ -283,6 +321,7 @@
<!--Feed information screen-->
<string name="authentication_label">Autentifikacija</string>
<string name="episode_filters_label">Epizodų filtras</string>
+ <string name="keep_updated">Pastoviai atnaujinti</string>
<!--Progress information-->
<!--AntennaPodSP-->
<!--Episodes apply actions-->
diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml
index 09c4815a3..db11eb90e 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/core/src/main/res/values-ru/strings.xml
@@ -33,6 +33,7 @@
<string name="drawer_feed_order_unplayed_episodes">Сортировать по количеству</string>
<string name="drawer_feed_order_alphabetical">Сортировать по алфавиту</string>
<string name="drawer_feed_order_last_update">Сортировать по дате</string>
+ <string name="drawer_feed_order_most_played">Сортировать по количеству прослушанных выпусков</string>
<string name="drawer_feed_counter_new_unplayed">Количество новых и непрослушанных выпусков</string>
<string name="drawer_feed_counter_new">Количество новых выпусков</string>
<string name="drawer_feed_counter_unplayed">Количество непрослушанных выпусков</string>
@@ -62,6 +63,7 @@
<string name="refresh_label">Обновить</string>
<string name="external_storage_error_msg">Внешний носитель недоступен. Убедитесь что внешний носитель установлен, иначе приложение не сможет нормально работать.</string>
<string name="chapters_label">Главы</string>
+ <string name="chapter_duration">Продолжительность: %1$s</string>
<string name="shownotes_label">Примечания к выпуску</string>
<string name="description_label">Описание</string>
<string name="most_recent_prefix">Последний выпуск:\u0020</string>
@@ -115,6 +117,7 @@
<string name="share_feed_url_label">Поделиться ссылкой на канал</string>
<string name="share_item_url_label">Поделиться ссылкой на файл выпуска</string>
<string name="share_item_url_with_position_label">Поделиться ссылкой на файл выпуска с отметкой времени</string>
+ <string name="feed_delete_confirmation_msg">Подтвердите, что хотите удалить канал \"%1$s\" и ВСЕ скачанные эпизоды этого канала.</string>
<string name="feed_remover_msg">Удаление канала</string>
<string name="load_complete_feed">Обновить весь канал</string>
<string name="hide_episodes_title">Скрыть выпуски</string>
@@ -407,6 +410,8 @@
<string name="search_hint">Найти выпуски</string>
<string name="found_in_shownotes_label">Найдено в примечаниях к выпуску</string>
<string name="found_in_chapters_label">Найдено в главах</string>
+ <string name="found_in_authors_label">Найдено в авторах</string>
+ <string name="found_in_feeds_label">Найдено в каналах</string>
<string name="search_status_no_results">Ничего не найдено</string>
<string name="search_label">Поиск</string>
<string name="found_in_title_label">Найдено в заголовке</string>