Wallabag 2.1.0 crashes when switching to another app while tts is running
# Issue details

### Duplicate?
Have you searched the issues of this repository if your issue is already known? yes

### Actual behaviour
- Wallabag 2.1.0 crashes when switching to another app while tts is running. Error message:

### Expected behaviour
- no crash

# Steps to reproduce the issue
1. Open any article in Wallabag Android 
2. Press the play button 
3. Press the "recent applications" button

# Environment details
- **wallabag app version**: 2.1.0
- **wallabag app installation source** (e.g. Gplay, F-Droid, manual): I tried both gplay and github 
- **Android OS version**: oreo 8.1.0
- **Android ROM** (e.g. stock, LineageOS, SlimRom,…): stock, Samsung Experience 9.5
- **Android hardware**: samsung J5  2018 SM-J530F
- **wallabag server version**: framabag
- **Do you have Two-Factor-Authentication enabled?**: don't know 


# Logs
## wallabag server
Please paste relevant wallabag server logs here (from file `<wallabag>/var/logs/prod.log`):
- bug not not related to wallabag server.

## Web server
Please paste relevant web server logs (e.g. from nginx, Apache, …) here:
- N/A
**NOTE:** Be super sure to remove sensitive data like passwords, note that everybody can look here!


# Your experience with wallabag Android app
Have you had any luck using wallabag Android app before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
- It works fine with the previous official release (no bug).

Logcat:

(I ran "logcat *.* | grep -i fr.gaulupeau.apps.Poche")

01-25 12:44:29.648  2992 12794 I ActivityManager: START u0 {act=android.intent.action.MAIN typ=null flg=0x10300000 cmp=ComponentInfo{fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity}} from uid 10176
01-25 12:44:29.721  2992 12794 I ActivityManager: Start proc 5602:fr.gaulupeau.apps.InThePoche/u0a584 for activity fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity
01-25 12:44:29.802  2992  3266 D GameManagerService: handleForegroundChange(). pkgName: fr.gaulupeau.apps.InThePoche, clsName: fr.gaulupeau.apps.Poche.ui.MainActivity,FgActivityName:fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity
01-25 12:44:29.940  2992  3102 D MdnieScenarioControlService:  packageName : fr.gaulupeau.apps.InThePoche    className : fr.gaulupeau.apps.Poche.ui.MainActivity
01-25 12:44:30.107  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.108  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.109  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.109  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.110  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.110  5602  5602 I zygote  :   at void fr.gaulupeau.apps.Poche.ui.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:112)
01-25 12:44:30.549  2638  2638 I SurfaceFlinger: id=6002 createSurf (720x1280),1 flag=404, fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity[5602]#0
01-25 12:44:31.046  2992  3552 D WindowManager: finishDrawingWindow: Window{d34691c u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity} mDrawState=DRAW_PENDING
01-25 12:44:31.065  2992  3018 D PersonaManagerService: notifyActivityDrawn:u0:fr.gaulupeau.apps.Poche.ui.MainActivity
01-25 12:44:31.069  2992  3018 I ActivityManager: Displayed fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity: +1s365ms
01-25 12:44:31.083  2638  2638 D SurfaceFlinger:        HWC | e7466b40 | 0000 | 0020 | 00 | 0100 | RGBA_8888   |    0.0,    0.0,  720.0, 1280.0 |    0,    0,  720, 1280 | fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity[5602]#0
01-25 12:44:31.093  2992  3552 D WindowManager: finishDrawingWindow: Window{d34691c u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity} mDrawState=HAS_DRAWN
01-25 12:44:31.770  5602  5629 I zygote  : Deoptimizing fr.gaulupeau.apps.Poche.data.dao.entities.Article fr.gaulupeau.apps.Poche.data.dao.ArticleDao.readEntity(android.database.Cursor, int) due to JIT inline cache
01-25 12:44:38.323  2992  6257 I ActivityManager: START u0 {act=null typ=null flg=0x0 cmp=ComponentInfo{fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity}} from uid 10584
01-25 12:44:38.353  2992  3266 D GameManagerService: handleForegroundChange(). pkgName: fr.gaulupeau.apps.InThePoche, clsName: fr.gaulupeau.apps.Poche.ui.ReadArticleActivity,FgActivityName:fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:39.123  2638  2638 I SurfaceFlinger: id=6003 createSurf (720x1280),1 flag=404, fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0
01-25 12:44:39.309  2992  3102 D MdnieScenarioControlService:  packageName : fr.gaulupeau.apps.InThePoche    className : fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:39.334  2992  3266 D GameManagerService: handleForegroundChange(). pkgName: fr.gaulupeau.apps.InThePoche, clsName: fr.gaulupeau.apps.Poche.ui.ReadArticleActivity,FgActivityName:fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:39.442  2992 12794 D WindowManager: finishDrawingWindow: Window{bdeb25b u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity} mDrawState=DRAW_PENDING
01-25 12:44:39.473  2638  2638 D SurfaceFlinger:        HWC | e7467740 | 0000 | 0020 | 00 | 0100 | RGBA_8888   |    0.0,    0.0,  720.0, 1280.0 |    0,    0,  720, 1280 | fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0
01-25 12:44:39.495  2992  3018 D PersonaManagerService: notifyActivityDrawn:u0:fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:39.551  2992  3552 D WindowManager: finishDrawingWindow: Window{bdeb25b u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity} mDrawState=HAS_DRAWN
01-25 12:44:39.640  2992  3552 E WindowManager: win=Window{d34691c u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=8, caller=com.android.server.wm.WindowManagerService.tryStartExitingAnimation:2851 com.android.server.wm.WindowManagerService.relayoutWindow:2590 com.android.server.wm.Session.relayout:267 android.view.IWindowSession$Stub.onTransact:288 com.android.server.wm.Session.onTransact:191 
01-25 12:44:39.640  2992  3552 I WindowManager: Destroying surface #fb19e6c: Surface(name=fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity) called by com.android.server.wm.WindowStateAnimator.destroySurface:2617 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:1026 com.android.server.wm.WindowState.destroyOrSaveSurfaceUnchecked:3821 com.android.server.wm.WindowState.destroySurface:3767 com.android.server.wm.WindowManagerService.tryStartExitingAnimation:2851 com.android.server.wm.WindowManagerService.relayoutWindow:2590 com.android.server.wm.Session.relayout:267 android.view.IWindowSession$Stub.onTransact:288 
01-25 12:44:39.640  2638  2649 I SurfaceFlinger: id=6002 Removed fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity[5602]#0 (3/9)
01-25 12:44:39.640  2638  2649 I SurfaceFlinger: id=6002 Removed fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity[5602]#0 (-2/9)
01-25 12:44:39.654  2638  2638 I Layer   : id=6002 onRemoved fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity[5602]#0 
01-25 12:44:39.790  2992  3102 D MdnieScenarioControlService:  packageName : fr.gaulupeau.apps.InThePoche    className : fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:40.706  2992 12794 I MediaFocusControl: requestAudioFocus() from uid/pid 10584/5602 clientId=android.media.AudioManager$68f82b0fr.gaulupeau.apps.Poche.tts.TtsService$90c7529 callingPack=fr.gaulupeau.apps.InThePoche req=1 flags=0x0 sdk=28
01-25 12:44:42.040  2992 12794 W ActivityManager:   Force finishing activity fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:42.132  2638  2638 D SurfaceFlinger:       GLES | e7467800 | 0000 | 0020 | 00 | 0100 | RGBA_8888   |    0.0,   47.0,  720.0,  515.0 |   49,  876,  671, 1280 | fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0
01-25 12:44:42.166  2638  2638 D SurfaceFlinger:       GLES | e7467800 | 0000 | 0020 | 00 | 0100 | RGBA_8888   |    0.0,   47.0,  720.0,  515.0 |   49,  876,  671, 1280 | fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0
01-25 12:44:42.226  2992  3061 E WindowManager: win=Window{bdeb25b u0 fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity EXITING} destroySurfaces: appStopped=true win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=4, caller=com.android.server.wm.AppWindowToken.destroySurfaces:748 com.android.server.wm.AppWindowToken.destroySurfaces:732 com.android.server.wm.WindowState.onExitAnimationDone:5523 com.android.server.wm.AppWindowAnimator.stepAnimationLocked:517 com.android.server.wm.AppWindowToken.stepAppWindowsAnimation:1745 
01-25 12:44:42.227  2992  3061 I WindowManager: Destroying surface #40459fb: Surface(name=fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity) called by com.android.server.wm.WindowStateAnimator.destroySurface:2617 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:1026 com.android.server.wm.WindowState.destroyOrSaveSurfaceUnchecked:3821 com.android.server.wm.WindowState.destroySurface:3767 com.android.server.wm.AppWindowToken.destroySurfaces:748 com.android.server.wm.AppWindowToken.destroySurfaces:732 com.android.server.wm.WindowState.onExitAnimationDone:5523 com.android.server.wm.AppWindowAnimator.stepAnimationLocked:517 
01-25 12:44:42.227  2638  2649 I SurfaceFlinger: id=6003 Removed fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0 (4/11)
01-25 12:44:42.229  2638  2638 I Layer   : id=6003 onRemoved fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0 
01-25 12:44:42.229  2638  2649 I SurfaceFlinger: id=6003 Removed fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity[5602]#0 (-2/11)
01-25 12:44:44.653  2992 12794 W ActivityManager:   Force finishing activity fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.ReadArticleActivity
01-25 12:44:44.688  2992 12794 W ActivityManager:   Force finishing activity fr.gaulupeau.apps.InThePoche/fr.gaulupeau.apps.Poche.ui.MainActivity



diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ba9d376f..03e47a87 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="22"/>
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- needed by TTS service for Android P or above -->
 
     <application
         android:name="fr.gaulupeau.apps.Poche.App"
@@ -158,4 +159,4 @@
         </provider>
     </application>
 
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
index df38910a..3610a0ca 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
@@ -119,6 +119,9 @@ public class TtsFragment
         //Log.d(LOG_TAG, "onAttach");
         super.onAttach(context);
         this.readArticleActivity = ((ReadArticleActivity) getActivity());
+        if ((this.readArticleActivity != null) && (webViewText != null)) {
+            webViewText.readArticleActivity = this.readArticleActivity;
+        }
         getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);
         if (volumeChangeReceiver == null) {
             volumeChangeReceiver = new BroadcastReceiver() {
@@ -538,6 +541,9 @@ public class TtsFragment
     public void onDocumentLoadFinished(WebView webView, ScrollView scrollView) {
         //Log.d(LOG_TAG, "onDocumentLoadFinished");
         if (webViewText == null) {
+            if (readArticleActivity == null) {
+                Log.e(LOG_TAG, "onDocumentLoadFinished(): readArticleActivity is null");
+            }
             webViewText = new WebViewText(webView, scrollView, readArticleActivity);
             webViewText.setOnReadFinishedCallback(new Runnable() {
                 @Override
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java
index ccd7db05..f29a8309 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java
@@ -1,6 +1,8 @@
 package fr.gaulupeau.apps.Poche.tts;
 
 import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.BroadcastReceiver;
@@ -9,6 +11,8 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.BitmapFactory;
+import android.media.AudioAttributes;
+import android.media.AudioFocusRequest;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.os.Binder;
@@ -116,6 +120,7 @@ public class TtsService
     private String ttsEngine;
     private String ttsVoice;
     private AudioManager audioManager;
+    private AudioFocusRequest audioFocusRequest;
     private MediaSessionCompat mediaSession;
     private MediaPlayer mediaPlayerPageFlip;
     private BroadcastReceiver noisyReceiver;
@@ -136,9 +141,12 @@ public class TtsService
         }
     };
     private PendingIntent notificationPendingIntent;
+    private NotificationChannel notificationChannel;
 
     private static final String LOG_TAG="TtsService";
     private static final int TTS_SPEAK_QUEUE_SIZE = 2;
+    private static final String NOTIFICATION_CHANNEL_ID = "fr.gaulupeau.apps.Poche.tts";
+    private static final String NOTIFICATION_CHANNEL_NAME = "Wallabag TTS";
 
 
     private static volatile TtsService instance;
@@ -235,7 +243,7 @@ public class TtsService
         setMediaSessionPlaybackState();
         setForegroundAndNotification();
         mediaSession.setActive(false);
-        audioManager.abandonAudioFocus(this);
+        abandonAudioFocus();
         executor.shutdown();
         executor = null;
         tts.stop();
@@ -246,7 +254,7 @@ public class TtsService
         tts.shutdown();
         tts = null;
         isTTSInitialized = false;
-        audioManager.abandonAudioFocus(this);
+        abandonAudioFocus();
         isAudioFocusGranted = false;
         instance = null;
         state = State.STOPPED;
@@ -302,8 +310,7 @@ public class TtsService
         Log.d(LOG_TAG, "playCmd");
         switch (state) {
             case CREATED:
-                if (audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)
-                        == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
+                if (requestAudioFocus() == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
                 {
                     isAudioFocusGranted = true;
                     mediaSession.setActive(true);
@@ -342,6 +349,47 @@ public class TtsService
         }
     }
 
+    private int requestAudioFocus() {
+        int audioFocusResult;
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            audioFocusResult = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+        } else {
+            if (this.audioFocusRequest == null) {
+                this.audioFocusRequest =
+                        new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
+                                .setOnAudioFocusChangeListener(this)
+                                .setWillPauseWhenDucked(true)
+                                .setAudioAttributes(
+                                        new AudioAttributes.Builder()
+                                                .setUsage(AudioAttributes.USAGE_MEDIA)
+                                                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
+                                                .build()
+                                )
+                                .build();
+            }
+            audioFocusResult = audioManager.requestAudioFocus(this.audioFocusRequest);
+        }
+        return audioFocusResult;
+    }
+
+    private int abandonAudioFocus() {
+        int audioFocusResult;
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            audioFocusResult = audioManager.abandonAudioFocus(this);
+        } else {
+            if (this.audioFocusRequest != null) {
+                audioFocusResult = audioManager.abandonAudioFocusRequest(this.audioFocusRequest);
+                if (audioFocusResult != AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
+                    this.audioFocusRequest = null;
+                }
+            } else {
+                audioFocusResult = AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+            }
+        }
+        return audioFocusResult;
+    }
+
+
     public void pauseCmd() {
         pauseCmd(State.PAUSED);
     }
@@ -737,6 +785,7 @@ public class TtsService
                     break;
                 case WANT_TO_PLAY:
                 case PLAYING:
+                    createNotificationChannel();
                     startForeground(1, generateNotification());
                     break;
                 case PAUSED:
@@ -755,6 +804,18 @@ public class TtsService
         }
     }
 
+    private void createNotificationChannel() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            if (notificationChannel == null) {
+                notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_NONE);
+                notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
+                NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+                assert manager != null;
+                manager.createNotificationChannel(notificationChannel);
+            }
+        }
+    }
+
     private Notification generateNotification() {
         NotificationCompat.Builder builder = generateNotificationBuilderFrom(getApplicationContext(), mediaSession);
         builder.setContentIntent(notificationPendingIntent);
@@ -785,7 +846,7 @@ public class TtsService
         MediaControllerCompat controller = mediaSession.getController();
         MediaMetadataCompat mediaMetadata = controller.getMetadata();
         MediaDescriptionCompat description = mediaMetadata.getDescription();
-        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
+        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
         builder
                 .setContentTitle(description.getTitle())
                 .setContentText(description.getSubtitle())
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
index f5118515..6b9e9789 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
@@ -15,7 +15,7 @@ import fr.gaulupeau.apps.Poche.ui.ReadArticleActivity;
  */
 public class WebViewText implements TextInterface {
 
-    private final ReadArticleActivity readArticleActivity;
+    ReadArticleActivity readArticleActivity;
     private final WebView webView;
     private final ScrollView scrollView;
     private final Handler handler;
@@ -276,12 +276,20 @@ public class WebViewText implements TextInterface {
 
     @Override
     public boolean skipToNext() {
-        return readArticleActivity.openNextArticle();
+        if (readArticleActivity != null) {
+            return readArticleActivity.openNextArticle();
+        } else {
+            return false;
+        }
     }
 
     @Override
     public boolean skipToPrevious() {
-        return readArticleActivity.openPreviousArticle();
+        if (readArticleActivity != null) {
+            return readArticleActivity.openPreviousArticle();
+        } else {
+            return false;
+        }
     }
 
     @Override
['app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java', 'app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java', 'app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java', 'app/src/main/AndroidManifest.xml']