From ed43b8252a69b96853b9a61729dc20fa7d48c250 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Sat, 28 Mar 2020 00:00:50 -0400
Subject: [PATCH] tv conversation: avoid recorder crash

Change-Id: I30cecf052ea69807d6e5982499a3e7e1a00b6677
---
 .../conversation/TvConversationFragment.java  | 64 +++++++++++--------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
index 4447f3270..81f271dd7 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
@@ -462,6 +462,12 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr
         requireActivity().invalidateOptionsMenu();
     }
 
+    @Override
+    public void onStop() {
+        releaseRecorder();
+        super.onStop();
+    }
+
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
@@ -507,30 +513,33 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr
     }
 
     private void startRecording() {
-        try {
-            fileName = AndroidFileUtils.createAudioFile(getContext());
-        } catch (IOException e) {
+        if (recorder != null) {
             return;
         }
-        recorder = new MediaRecorder();
-        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
-        recorder.setOutputFile(fileName.getAbsolutePath());
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            recorder.setOutputFormat(MediaRecorder.OutputFormat.OGG);
-            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.OPUS);
-        } else {
-            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
-            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
-        }
-
         try {
+            fileName = AndroidFileUtils.createAudioFile(requireContext());
+            recorder = new MediaRecorder();
+            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+            recorder.setOutputFile(fileName.getAbsolutePath());
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                recorder.setOutputFormat(MediaRecorder.OutputFormat.OGG);
+                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.OPUS);
+            } else {
+                recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
+                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+            }
+
             recorder.prepare();
-        } catch (IOException e) {
-            Log.e(LOG_TAG, "prepare() failed");
+            recorder.start();
+        } catch (Exception e) {
+            Toast.makeText(requireContext(), "Error starting recording: " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
+            if (recorder != null) {
+                recorder.release();
+                recorder = null;
+            }
+            return;
         }
 
-        recorder.start();
-
         mAudioButton.setImageResource(R.drawable.lb_ic_stop);
         mTextAudio.setText(R.string.tv_audio_recording);
         Animation anim = new AlphaAnimation(0.0f, 1.0f);
@@ -541,18 +550,23 @@ public class TvConversationFragment extends BaseSupportFragment<TvConversationPr
         mTextAudio.startAnimation(anim);
     }
 
-    private void stopRecording() {
-        if (recorder == null) {
-            return;
+    private void releaseRecorder() {
+        if (recorder != null) {
+            try {
+                recorder.stop();
+            } catch (Exception e) {
+                Log.w(TAG, "Exception stopping recorder");
+            }
+            recorder.release();
+            recorder = null;
         }
-        recorder.stop();
-        recorder.release();
-        recorder = null;
+    }
 
+    private void stopRecording() {
+        releaseRecorder();
         mAudioButton.setImageResource(R.drawable.baseline_mic_24);
         mTextAudio.setText(R.string.tv_send_audio);
         mTextAudio.clearAnimation();
-
         createAudioDialog();
     }
 
-- 
GitLab