summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.tx/config74
-rw-r--r--app/build.gradle1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/WidgetConfigActivity.java4
-rw-r--r--core/build.gradle6
-rw-r--r--core/lint.xml8
-rw-r--r--core/src/main/AndroidManifest.xml5
-rw-r--r--core/src/main/java/androidx/core/app/SafeJobIntentService.java118
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterJobService.java33
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterWorker.java59
-rw-r--r--settings.gradle1
-rw-r--r--ui/i18n/README.md3
-rw-r--r--ui/i18n/build.gradle15
-rw-r--r--ui/i18n/lint.xml10
-rw-r--r--ui/i18n/src/main/AndroidManifest.xml1
-rw-r--r--ui/i18n/src/main/res/values-ar/strings.xml (renamed from core/src/main/res/values-ar/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ast/strings.xml (renamed from core/src/main/res/values-ast/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-br/strings.xml (renamed from core/src/main/res/values-br/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ca/strings.xml (renamed from core/src/main/res/values-ca/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-cs/strings.xml (renamed from core/src/main/res/values-cs/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-da/strings.xml (renamed from core/src/main/res/values-da/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-de/strings.xml (renamed from core/src/main/res/values-de/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-es/strings.xml (renamed from core/src/main/res/values-es/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-et/strings.xml (renamed from core/src/main/res/values-et/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-eu/strings.xml (renamed from core/src/main/res/values-eu/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-fa/strings.xml (renamed from core/src/main/res/values-fa/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-fi/strings.xml (renamed from core/src/main/res/values-fi/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-fr/strings.xml (renamed from core/src/main/res/values-fr/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-gl/strings.xml (renamed from core/src/main/res/values-gl/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-hu/strings.xml (renamed from core/src/main/res/values-hu/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-it/strings.xml (renamed from core/src/main/res/values-it/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-iw/strings.xml (renamed from core/src/main/res/values-iw/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ja/strings.xml (renamed from core/src/main/res/values-ja/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ko/strings.xml (renamed from core/src/main/res/values-ko/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-lt/strings.xml (renamed from core/src/main/res/values-lt/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-nb/strings.xml (renamed from core/src/main/res/values-nb/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-nl/strings.xml (renamed from core/src/main/res/values-nl/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-pl/strings.xml (renamed from core/src/main/res/values-pl/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-pt-rBR/strings.xml (renamed from core/src/main/res/values-pt-rBR/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-pt/strings.xml (renamed from core/src/main/res/values-pt/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ro/strings.xml (renamed from core/src/main/res/values-ro/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-ru/strings.xml (renamed from core/src/main/res/values-ru/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-sk/strings.xml (renamed from core/src/main/res/values-sk/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-sl/strings.xml (renamed from core/src/main/res/values-sl/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-sv/strings.xml (renamed from core/src/main/res/values-sv/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-tr/strings.xml (renamed from core/src/main/res/values-tr/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-uk/strings.xml (renamed from core/src/main/res/values-uk/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-zh-rCN/strings.xml (renamed from core/src/main/res/values-zh-rCN/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values-zh-rTW/strings.xml (renamed from core/src/main/res/values-zh-rTW/strings.xml)0
-rw-r--r--ui/i18n/src/main/res/values/strings.xml (renamed from core/src/main/res/values/strings.xml)0
50 files changed, 136 insertions, 210 deletions
diff --git a/.tx/config b/.tx/config
index 5a24aecaf..601e24dbd 100644
--- a/.tx/config
+++ b/.tx/config
@@ -2,44 +2,44 @@
host = https://www.transifex.com
[antennapod.core-values]
-source_file = core/src/main/res/values/strings.xml
+source_file = ui/i18n/src/main/res/values/strings.xml
source_lang = en
-trans.ar = core/src/main/res/values-ar/strings.xml
-trans.ast_ES = core/src/main/res/values-ast/strings.xml
-trans.br = core/src/main/res/values-br/strings.xml
-trans.ca = core/src/main/res/values-ca/strings.xml
-trans.cs_CZ = core/src/main/res/values-cs/strings.xml
-trans.da = core/src/main/res/values-da/strings.xml
-trans.de = core/src/main/res/values-de/strings.xml
-trans.es = core/src/main/res/values-es/strings.xml
-trans.et = core/src/main/res/values-et/strings.xml
-trans.eu = core/src/main/res/values-eu/strings.xml
-trans.fa = core/src/main/res/values-fa/strings.xml
-trans.fi = core/src/main/res/values-fi/strings.xml
-trans.fr = core/src/main/res/values-fr/strings.xml
-trans.gl = core/src/main/res/values-gl/strings.xml
-trans.he_IL = core/src/main/res/values-iw/strings.xml
-trans.hi_IN = core/src/main/res/values-hi/strings.xml
-trans.hu = core/src/main/res/values-hu/strings.xml
-trans.it_IT = core/src/main/res/values-it/strings.xml
-trans.ja = core/src/main/res/values-ja/strings.xml
-trans.ko = core/src/main/res/values-ko/strings.xml
-trans.lt = core/src/main/res/values-lt/strings.xml
-trans.nb_NO = core/src/main/res/values-nb/strings.xml
-trans.nl = core/src/main/res/values-nl/strings.xml
-trans.pl_PL = core/src/main/res/values-pl/strings.xml
-trans.pt = core/src/main/res/values-pt/strings.xml
-trans.pt_BR = core/src/main/res/values-pt-rBR/strings.xml
-trans.ro_RO = core/src/main/res/values-ro/strings.xml
-trans.ru_RU = core/src/main/res/values-ru/strings.xml
-trans.sk = core/src/main/res/values-sk/strings.xml
-trans.sl_SI = core/src/main/res/values-sl/strings.xml
-trans.sv_SE = core/src/main/res/values-sv/strings.xml
-trans.tr = core/src/main/res/values-tr/strings.xml
-trans.uk_UA = core/src/main/res/values-uk/strings.xml
-trans.zh_CN = core/src/main/res/values-zh-rCN/strings.xml
-trans.zh_TW = core/src/main/res/values-zh-rTW/strings.xml
-trans.zh_HK = core/src/main/res/values-zh-rHK/strings.xml
+trans.ar = ui/i18n/src/main/res/values-ar/strings.xml
+trans.ast_ES = ui/i18n/src/main/res/values-ast/strings.xml
+trans.br = ui/i18n/src/main/res/values-br/strings.xml
+trans.ca = ui/i18n/src/main/res/values-ca/strings.xml
+trans.cs_CZ = ui/i18n/src/main/res/values-cs/strings.xml
+trans.da = ui/i18n/src/main/res/values-da/strings.xml
+trans.de = ui/i18n/src/main/res/values-de/strings.xml
+trans.es = ui/i18n/src/main/res/values-es/strings.xml
+trans.et = ui/i18n/src/main/res/values-et/strings.xml
+trans.eu = ui/i18n/src/main/res/values-eu/strings.xml
+trans.fa = ui/i18n/src/main/res/values-fa/strings.xml
+trans.fi = ui/i18n/src/main/res/values-fi/strings.xml
+trans.fr = ui/i18n/src/main/res/values-fr/strings.xml
+trans.gl = ui/i18n/src/main/res/values-gl/strings.xml
+trans.he_IL = ui/i18n/src/main/res/values-iw/strings.xml
+trans.hi_IN = ui/i18n/src/main/res/values-hi/strings.xml
+trans.hu = ui/i18n/src/main/res/values-hu/strings.xml
+trans.it_IT = ui/i18n/src/main/res/values-it/strings.xml
+trans.ja = ui/i18n/src/main/res/values-ja/strings.xml
+trans.ko = ui/i18n/src/main/res/values-ko/strings.xml
+trans.lt = ui/i18n/src/main/res/values-lt/strings.xml
+trans.nb_NO = ui/i18n/src/main/res/values-nb/strings.xml
+trans.nl = ui/i18n/src/main/res/values-nl/strings.xml
+trans.pl_PL = ui/i18n/src/main/res/values-pl/strings.xml
+trans.pt = ui/i18n/src/main/res/values-pt/strings.xml
+trans.pt_BR = ui/i18n/src/main/res/values-pt-rBR/strings.xml
+trans.ro_RO = ui/i18n/src/main/res/values-ro/strings.xml
+trans.ru_RU = ui/i18n/src/main/res/values-ru/strings.xml
+trans.sk = ui/i18n/src/main/res/values-sk/strings.xml
+trans.sl_SI = ui/i18n/src/main/res/values-sl/strings.xml
+trans.sv_SE = ui/i18n/src/main/res/values-sv/strings.xml
+trans.tr = ui/i18n/src/main/res/values-tr/strings.xml
+trans.uk_UA = ui/i18n/src/main/res/values-uk/strings.xml
+trans.zh_CN = ui/i18n/src/main/res/values-zh-rCN/strings.xml
+trans.zh_TW = ui/i18n/src/main/res/values-zh-rTW/strings.xml
+trans.zh_HK = ui/i18n/src/main/res/values-zh-rHK/strings.xml
[antennapod.description]
source_file = app/src/main/play/listings/en-US/full-description.txt
diff --git a/app/build.gradle b/app/build.gradle
index 7b324e878..40759dd56 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -120,6 +120,7 @@ dependencies {
implementation project(':playback:cast')
implementation project(':ui:app-start-intent')
implementation project(':ui:common')
+ implementation project(':ui:i18n')
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
implementation "androidx.appcompat:appcompat:$appcompatVersion"
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/WidgetConfigActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/WidgetConfigActivity.java
index 4cf925860..7245ce675 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/WidgetConfigActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/WidgetConfigActivity.java
@@ -12,7 +12,7 @@ import androidx.appcompat.app.AppCompatActivity;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.receiver.PlayerWidget;
-import de.danoeh.antennapod.core.widget.WidgetUpdaterJobService;
+import de.danoeh.antennapod.core.widget.WidgetUpdaterWorker;
public class WidgetConfigActivity extends AppCompatActivity {
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@@ -109,7 +109,7 @@ public class WidgetConfigActivity extends AppCompatActivity {
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_OK, resultValue);
finish();
- WidgetUpdaterJobService.performBackgroundUpdate(this);
+ WidgetUpdaterWorker.enqueueWork(this);
}
private int getColorWithAlpha(int color, int opacity) {
diff --git a/core/build.gradle b/core/build.gradle
index af0e2a7a7..13489f996 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -7,9 +7,8 @@ apply from: "../playFlavor.gradle"
android {
lintOptions {
disable "InvalidPeriodicWorkRequestInterval", "ObsoleteLintCustomCheck", "DefaultLocale", "UnusedAttribute",
- "ParcelClassLoader", "Typos", "ExtraTranslation", "ImpliedQuantity", "CheckResult",
- "PluralsCandidate", "UnusedQuantity", "StringFormatCount", "TrustAllX509TrustManager",
- "StaticFieldLeak", "TypographyEllipsis", "IconDensities", "IconDuplicates"
+ "ParcelClassLoader", "CheckResult", "TrustAllX509TrustManager",
+ "StaticFieldLeak", "IconDensities", "IconDuplicates"
}
defaultConfig {
@@ -33,6 +32,7 @@ dependencies {
implementation project(':playback:cast')
implementation project(':ui:app-start-intent')
implementation project(':ui:common')
+ implementation project(':ui:i18n')
implementation project(':ui:png-icons')
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
diff --git a/core/lint.xml b/core/lint.xml
index aa2c50677..f3cb24810 100644
--- a/core/lint.xml
+++ b/core/lint.xml
@@ -4,12 +4,4 @@
<ignore path="res/drawable/ic_settings.xml" />
<ignore path="res/drawable/ic_settings_white.xml" />
</issue>
-
- <issue id="MissingDefaultResource">
- <ignore path="**/values-**/strings.xml" />
- </issue>
-
- <issue id="UnusedResources" severity="error">
- <ignore path="**/values-**/strings.xml" />
- </issue>
</lint>
diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
index 7478eb48a..9b23acd1d 100644
--- a/core/src/main/AndroidManifest.xml
+++ b/core/src/main/AndroidManifest.xml
@@ -46,11 +46,6 @@
android:label="@string/feed_update_receiver_name"
android:exported="true"
tools:ignore="ExportedReceiver" /> <!-- allow feeds update to be triggered by external apps -->
-
- <service
- android:name=".widget.WidgetUpdaterJobService"
- android:permission="android.permission.BIND_JOB_SERVICE"
- android:exported="true"/>
</application>
<queries>
diff --git a/core/src/main/java/androidx/core/app/SafeJobIntentService.java b/core/src/main/java/androidx/core/app/SafeJobIntentService.java
deleted file mode 100644
index aedc9418b..000000000
--- a/core/src/main/java/androidx/core/app/SafeJobIntentService.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package androidx.core.app;
-
-import android.app.job.JobParameters;
-import android.app.job.JobServiceEngine;
-import android.app.job.JobWorkItem;
-import android.content.Intent;
-import android.os.Build;
-import android.os.IBinder;
-import androidx.annotation.RequiresApi;
-import android.util.Log;
-
-
-public abstract class SafeJobIntentService extends JobIntentService {
-
- @Override
- public void onCreate() {
- super.onCreate();
- if (Build.VERSION.SDK_INT >= 26) {
- mJobImpl = new SafeJobServiceEngineImpl(this);
- }
- }
-
- /**
- * Implementation of a safe JobServiceEngine for interaction with JobIntentService.
- */
- @RequiresApi(26)
- static final class SafeJobServiceEngineImpl extends JobServiceEngine
- implements JobIntentService.CompatJobEngine {
- static final String TAG = "JobServiceEngineImpl";
-
- static final boolean DEBUG = false;
-
- final JobIntentService mService;
- final Object mLock = new Object();
- JobParameters mParams;
-
- final class WrapperWorkItem implements JobIntentService.GenericWorkItem {
- final JobWorkItem mJobWork;
-
- WrapperWorkItem(JobWorkItem jobWork) {
- mJobWork = jobWork;
- }
-
- @Override
- public Intent getIntent() {
- return mJobWork.getIntent();
- }
-
- @Override
- public void complete() {
- synchronized (mLock) {
- if (mParams != null) {
- try {
- mParams.completeWork(mJobWork);
- } catch (SecurityException e) {
- Log.e(TAG, Log.getStackTraceString(e));
- }
- }
- }
- }
- }
-
- SafeJobServiceEngineImpl(JobIntentService service) {
- super(service);
- mService = service;
- }
-
- @Override
- public IBinder compatGetBinder() {
- return getBinder();
- }
-
- @Override
- public boolean onStartJob(JobParameters params) {
- if (DEBUG) Log.d(TAG, "onStartJob: " + params);
- mParams = params;
- // We can now start dequeuing work!
- mService.ensureProcessorRunningLocked(false);
- return true;
- }
-
- @Override
- public boolean onStopJob(JobParameters params) {
- if (DEBUG) Log.d(TAG, "onStartJob: " + params);
- boolean result = mService.doStopCurrentWork();
- synchronized (mLock) {
- // Once we return, the job is stopped, so its JobParameters are no
- // longer valid and we should not be doing anything with them.
- mParams = null;
- }
- return result;
- }
-
- /**
- * Dequeue some work.
- */
- @Override
- public JobIntentService.GenericWorkItem dequeueWork() {
- JobWorkItem work = null;
- synchronized (mLock) {
- if (mParams == null) {
- return null;
- }
- try {
- work = mParams.dequeueWork();
- } catch (SecurityException e) {
- Log.e(TAG, Log.getStackTraceString(e));
- }
- }
- if (work != null) {
- work.getIntent().setExtrasClassLoader(mService.getClassLoader());
- return new WrapperWorkItem(work);
- } else {
- return null;
- }
- }
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
index cf0debed2..842dcdf75 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
@@ -9,7 +9,7 @@ import android.util.Log;
import java.util.Arrays;
-import de.danoeh.antennapod.core.widget.WidgetUpdaterJobService;
+import de.danoeh.antennapod.core.widget.WidgetUpdaterWorker;
public class PlayerWidget extends AppWidgetProvider {
private static final String TAG = "PlayerWidget";
@@ -25,7 +25,7 @@ public class PlayerWidget extends AppWidgetProvider {
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive");
super.onReceive(context, intent);
- WidgetUpdaterJobService.performBackgroundUpdate(context);
+ WidgetUpdaterWorker.enqueueWork(context);
}
@Override
@@ -33,14 +33,14 @@ public class PlayerWidget extends AppWidgetProvider {
super.onEnabled(context);
Log.d(TAG, "Widget enabled");
setEnabled(context, true);
- WidgetUpdaterJobService.performBackgroundUpdate(context);
+ WidgetUpdaterWorker.enqueueWork(context);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.d(TAG, "onUpdate() called with: " + "context = [" + context + "], appWidgetManager = ["
+ appWidgetManager + "], appWidgetIds = [" + Arrays.toString(appWidgetIds) + "]");
- WidgetUpdaterJobService.performBackgroundUpdate(context);
+ WidgetUpdaterWorker.enqueueWork(context);
}
@Override
diff --git a/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterJobService.java b/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterJobService.java
deleted file mode 100644
index 598544a0c..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterJobService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package de.danoeh.antennapod.core.widget;
-
-import android.content.Context;
-import android.content.Intent;
-import androidx.annotation.NonNull;
-import androidx.core.app.SafeJobIntentService;
-import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
-import de.danoeh.antennapod.model.playback.Playable;
-import de.danoeh.antennapod.core.util.playback.PlayableUtils;
-import de.danoeh.antennapod.playback.base.PlayerStatus;
-
-public class WidgetUpdaterJobService extends SafeJobIntentService {
- private static final int JOB_ID = -17001;
-
- /**
- * Loads the current media from the database and updates the widget in a background job.
- */
- public static void performBackgroundUpdate(Context context) {
- enqueueWork(context, WidgetUpdaterJobService.class,
- WidgetUpdaterJobService.JOB_ID, new Intent(context, WidgetUpdaterJobService.class));
- }
-
- @Override
- protected void onHandleWork(@NonNull Intent intent) {
- Playable media = PlayableUtils.createInstanceFromPreferences(getApplicationContext());
- if (media != null) {
- WidgetUpdater.updateWidget(this, new WidgetUpdater.WidgetState(media, PlayerStatus.STOPPED,
- media.getPosition(), media.getDuration(), PlaybackSpeedUtils.getCurrentPlaybackSpeed(media)));
- } else {
- WidgetUpdater.updateWidget(this, new WidgetUpdater.WidgetState(PlayerStatus.STOPPED));
- }
- }
-} \ No newline at end of file
diff --git a/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterWorker.java b/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterWorker.java
new file mode 100644
index 000000000..3b8546a8e
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/widget/WidgetUpdaterWorker.java
@@ -0,0 +1,59 @@
+package de.danoeh.antennapod.core.widget;
+
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.work.OneTimeWorkRequest;
+import androidx.work.WorkManager;
+import androidx.work.WorkRequest;
+import androidx.work.Worker;
+import androidx.work.WorkerParameters;
+
+import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
+import de.danoeh.antennapod.core.util.playback.PlayableUtils;
+import de.danoeh.antennapod.model.playback.Playable;
+import de.danoeh.antennapod.playback.base.PlayerStatus;
+
+public class WidgetUpdaterWorker extends Worker {
+
+ private static final String TAG = "WidgetUpdaterWorker";
+
+ public WidgetUpdaterWorker(@NonNull final Context context,
+ @NonNull final WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
+
+ public static void enqueueWork(final Context context) {
+ final WorkRequest workRequest = new OneTimeWorkRequest.Builder(WidgetUpdaterWorker.class).build();
+ WorkManager.getInstance(context).enqueue(workRequest);
+ }
+
+ @NonNull
+ @Override
+ public Result doWork() {
+ try {
+ updateWidget();
+ } catch (final Exception e) {
+ Log.d(TAG, "Failed to update AntennaPod widget: ", e);
+ return Result.failure();
+ }
+ return Result.success();
+ }
+
+ /**
+ * Loads the current media from the database and updates the widget in a background job.
+ */
+ private void updateWidget() {
+ final Playable media = PlayableUtils.createInstanceFromPreferences(getApplicationContext());
+ if (media != null) {
+ WidgetUpdater.updateWidget(getApplicationContext(),
+ new WidgetUpdater.WidgetState(media, PlayerStatus.STOPPED,
+ media.getPosition(), media.getDuration(),
+ PlaybackSpeedUtils.getCurrentPlaybackSpeed(media)));
+ } else {
+ WidgetUpdater.updateWidget(getApplicationContext(),
+ new WidgetUpdater.WidgetState(PlayerStatus.STOPPED));
+ }
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index c7f5e6449..96989ab69 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -15,4 +15,5 @@ include ':playback:cast'
include ':ui:app-start-intent'
include ':ui:common'
+include ':ui:i18n'
include ':ui:png-icons'
diff --git a/ui/i18n/README.md b/ui/i18n/README.md
new file mode 100644
index 000000000..a15c38807
--- /dev/null
+++ b/ui/i18n/README.md
@@ -0,0 +1,3 @@
+# :ui:i18n
+
+The abbreviation i18n stands for internationalization. This module contains the app's main texts that are translated to different languages. Most modules that show UI depend on this module.
diff --git a/ui/i18n/build.gradle b/ui/i18n/build.gradle
new file mode 100644
index 000000000..a1ace417b
--- /dev/null
+++ b/ui/i18n/build.gradle
@@ -0,0 +1,15 @@
+plugins {
+ id("com.android.library")
+}
+apply from: "../../common.gradle"
+
+android {
+ lintOptions {
+ disable "Typos", "ExtraTranslation", "ImpliedQuantity",
+ "PluralsCandidate", "UnusedQuantity", "TypographyEllipsis"
+ }
+}
+
+dependencies {
+ annotationProcessor "androidx.annotation:annotation:$annotationVersion"
+}
diff --git a/ui/i18n/lint.xml b/ui/i18n/lint.xml
new file mode 100644
index 000000000..e35ec9859
--- /dev/null
+++ b/ui/i18n/lint.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <issue id="MissingDefaultResource">
+ <ignore path="**/values-**/strings.xml" />
+ </issue>
+
+ <issue id="UnusedResources" severity="error">
+ <ignore path="**/values-**/strings.xml" />
+ </issue>
+</lint>
diff --git a/ui/i18n/src/main/AndroidManifest.xml b/ui/i18n/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..8729444b0
--- /dev/null
+++ b/ui/i18n/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+<manifest package="de.danoeh.antennapod.ui.i18n" />
diff --git a/core/src/main/res/values-ar/strings.xml b/ui/i18n/src/main/res/values-ar/strings.xml
index 01d2b04bb..01d2b04bb 100644
--- a/core/src/main/res/values-ar/strings.xml
+++ b/ui/i18n/src/main/res/values-ar/strings.xml
diff --git a/core/src/main/res/values-ast/strings.xml b/ui/i18n/src/main/res/values-ast/strings.xml
index e9d1ea593..e9d1ea593 100644
--- a/core/src/main/res/values-ast/strings.xml
+++ b/ui/i18n/src/main/res/values-ast/strings.xml
diff --git a/core/src/main/res/values-br/strings.xml b/ui/i18n/src/main/res/values-br/strings.xml
index ef69b8099..ef69b8099 100644
--- a/core/src/main/res/values-br/strings.xml
+++ b/ui/i18n/src/main/res/values-br/strings.xml
diff --git a/core/src/main/res/values-ca/strings.xml b/ui/i18n/src/main/res/values-ca/strings.xml
index 72cd0f33a..72cd0f33a 100644
--- a/core/src/main/res/values-ca/strings.xml
+++ b/ui/i18n/src/main/res/values-ca/strings.xml
diff --git a/core/src/main/res/values-cs/strings.xml b/ui/i18n/src/main/res/values-cs/strings.xml
index 69736be49..69736be49 100644
--- a/core/src/main/res/values-cs/strings.xml
+++ b/ui/i18n/src/main/res/values-cs/strings.xml
diff --git a/core/src/main/res/values-da/strings.xml b/ui/i18n/src/main/res/values-da/strings.xml
index a6fec5b82..a6fec5b82 100644
--- a/core/src/main/res/values-da/strings.xml
+++ b/ui/i18n/src/main/res/values-da/strings.xml
diff --git a/core/src/main/res/values-de/strings.xml b/ui/i18n/src/main/res/values-de/strings.xml
index d3f6ded98..d3f6ded98 100644
--- a/core/src/main/res/values-de/strings.xml
+++ b/ui/i18n/src/main/res/values-de/strings.xml
diff --git a/core/src/main/res/values-es/strings.xml b/ui/i18n/src/main/res/values-es/strings.xml
index 922154cb5..922154cb5 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/ui/i18n/src/main/res/values-es/strings.xml
diff --git a/core/src/main/res/values-et/strings.xml b/ui/i18n/src/main/res/values-et/strings.xml
index 0427fe34a..0427fe34a 100644
--- a/core/src/main/res/values-et/strings.xml
+++ b/ui/i18n/src/main/res/values-et/strings.xml
diff --git a/core/src/main/res/values-eu/strings.xml b/ui/i18n/src/main/res/values-eu/strings.xml
index bddbee895..bddbee895 100644
--- a/core/src/main/res/values-eu/strings.xml
+++ b/ui/i18n/src/main/res/values-eu/strings.xml
diff --git a/core/src/main/res/values-fa/strings.xml b/ui/i18n/src/main/res/values-fa/strings.xml
index e6145d62b..e6145d62b 100644
--- a/core/src/main/res/values-fa/strings.xml
+++ b/ui/i18n/src/main/res/values-fa/strings.xml
diff --git a/core/src/main/res/values-fi/strings.xml b/ui/i18n/src/main/res/values-fi/strings.xml
index 28d17bfdc..28d17bfdc 100644
--- a/core/src/main/res/values-fi/strings.xml
+++ b/ui/i18n/src/main/res/values-fi/strings.xml
diff --git a/core/src/main/res/values-fr/strings.xml b/ui/i18n/src/main/res/values-fr/strings.xml
index b0ffcb348..b0ffcb348 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/ui/i18n/src/main/res/values-fr/strings.xml
diff --git a/core/src/main/res/values-gl/strings.xml b/ui/i18n/src/main/res/values-gl/strings.xml
index a524d722d..a524d722d 100644
--- a/core/src/main/res/values-gl/strings.xml
+++ b/ui/i18n/src/main/res/values-gl/strings.xml
diff --git a/core/src/main/res/values-hu/strings.xml b/ui/i18n/src/main/res/values-hu/strings.xml
index 4eabe54bb..4eabe54bb 100644
--- a/core/src/main/res/values-hu/strings.xml
+++ b/ui/i18n/src/main/res/values-hu/strings.xml
diff --git a/core/src/main/res/values-it/strings.xml b/ui/i18n/src/main/res/values-it/strings.xml
index a93e0527c..a93e0527c 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/ui/i18n/src/main/res/values-it/strings.xml
diff --git a/core/src/main/res/values-iw/strings.xml b/ui/i18n/src/main/res/values-iw/strings.xml
index 1dc4cbb32..1dc4cbb32 100644
--- a/core/src/main/res/values-iw/strings.xml
+++ b/ui/i18n/src/main/res/values-iw/strings.xml
diff --git a/core/src/main/res/values-ja/strings.xml b/ui/i18n/src/main/res/values-ja/strings.xml
index 44d0b42e1..44d0b42e1 100644
--- a/core/src/main/res/values-ja/strings.xml
+++ b/ui/i18n/src/main/res/values-ja/strings.xml
diff --git a/core/src/main/res/values-ko/strings.xml b/ui/i18n/src/main/res/values-ko/strings.xml
index bffc8059c..bffc8059c 100644
--- a/core/src/main/res/values-ko/strings.xml
+++ b/ui/i18n/src/main/res/values-ko/strings.xml
diff --git a/core/src/main/res/values-lt/strings.xml b/ui/i18n/src/main/res/values-lt/strings.xml
index ffa272965..ffa272965 100644
--- a/core/src/main/res/values-lt/strings.xml
+++ b/ui/i18n/src/main/res/values-lt/strings.xml
diff --git a/core/src/main/res/values-nb/strings.xml b/ui/i18n/src/main/res/values-nb/strings.xml
index 389ab6a41..389ab6a41 100644
--- a/core/src/main/res/values-nb/strings.xml
+++ b/ui/i18n/src/main/res/values-nb/strings.xml
diff --git a/core/src/main/res/values-nl/strings.xml b/ui/i18n/src/main/res/values-nl/strings.xml
index 31f030290..31f030290 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/ui/i18n/src/main/res/values-nl/strings.xml
diff --git a/core/src/main/res/values-pl/strings.xml b/ui/i18n/src/main/res/values-pl/strings.xml
index 97a138113..97a138113 100644
--- a/core/src/main/res/values-pl/strings.xml
+++ b/ui/i18n/src/main/res/values-pl/strings.xml
diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/ui/i18n/src/main/res/values-pt-rBR/strings.xml
index c994b55ac..c994b55ac 100644
--- a/core/src/main/res/values-pt-rBR/strings.xml
+++ b/ui/i18n/src/main/res/values-pt-rBR/strings.xml
diff --git a/core/src/main/res/values-pt/strings.xml b/ui/i18n/src/main/res/values-pt/strings.xml
index 646f9cdc2..646f9cdc2 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/ui/i18n/src/main/res/values-pt/strings.xml
diff --git a/core/src/main/res/values-ro/strings.xml b/ui/i18n/src/main/res/values-ro/strings.xml
index b9cf03cb8..b9cf03cb8 100644
--- a/core/src/main/res/values-ro/strings.xml
+++ b/ui/i18n/src/main/res/values-ro/strings.xml
diff --git a/core/src/main/res/values-ru/strings.xml b/ui/i18n/src/main/res/values-ru/strings.xml
index 01dd6fe81..01dd6fe81 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/ui/i18n/src/main/res/values-ru/strings.xml
diff --git a/core/src/main/res/values-sk/strings.xml b/ui/i18n/src/main/res/values-sk/strings.xml
index 3de3327c2..3de3327c2 100644
--- a/core/src/main/res/values-sk/strings.xml
+++ b/ui/i18n/src/main/res/values-sk/strings.xml
diff --git a/core/src/main/res/values-sl/strings.xml b/ui/i18n/src/main/res/values-sl/strings.xml
index 2415c1625..2415c1625 100644
--- a/core/src/main/res/values-sl/strings.xml
+++ b/ui/i18n/src/main/res/values-sl/strings.xml
diff --git a/core/src/main/res/values-sv/strings.xml b/ui/i18n/src/main/res/values-sv/strings.xml
index caabb24cf..caabb24cf 100644
--- a/core/src/main/res/values-sv/strings.xml
+++ b/ui/i18n/src/main/res/values-sv/strings.xml
diff --git a/core/src/main/res/values-tr/strings.xml b/ui/i18n/src/main/res/values-tr/strings.xml
index aa0305e66..aa0305e66 100644
--- a/core/src/main/res/values-tr/strings.xml
+++ b/ui/i18n/src/main/res/values-tr/strings.xml
diff --git a/core/src/main/res/values-uk/strings.xml b/ui/i18n/src/main/res/values-uk/strings.xml
index 8660a5b38..8660a5b38 100644
--- a/core/src/main/res/values-uk/strings.xml
+++ b/ui/i18n/src/main/res/values-uk/strings.xml
diff --git a/core/src/main/res/values-zh-rCN/strings.xml b/ui/i18n/src/main/res/values-zh-rCN/strings.xml
index 5ad647f98..5ad647f98 100644
--- a/core/src/main/res/values-zh-rCN/strings.xml
+++ b/ui/i18n/src/main/res/values-zh-rCN/strings.xml
diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/ui/i18n/src/main/res/values-zh-rTW/strings.xml
index 616c1d0d9..616c1d0d9 100644
--- a/core/src/main/res/values-zh-rTW/strings.xml
+++ b/ui/i18n/src/main/res/values-zh-rTW/strings.xml
diff --git a/core/src/main/res/values/strings.xml b/ui/i18n/src/main/res/values/strings.xml
index 197d0c636..197d0c636 100644
--- a/core/src/main/res/values/strings.xml
+++ b/ui/i18n/src/main/res/values/strings.xml