Merge "Catch exception when muxing fails to start" into udc-dev
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7dc8afe..003f9b0 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -295,9 +295,8 @@
<string name="screenrecord_save_title">Screen recording saved</string>
<!-- Subtext for a notification shown after saving a screen recording to prompt the user to view it [CHAR_LIMIT=100] -->
<string name="screenrecord_save_text">Tap to view</string>
- <!-- A toast message shown when there is an error deleting a screen recording [CHAR LIMIT=NONE] -->
- <string name="screenrecord_delete_error">Error deleting screen recording</string>
- <!-- A toast message shown when the screen recording cannot be started due to insufficient permissions [CHAR LIMIT=NONE] -->
+ <!-- A toast message shown when there is an error saving a screen recording [CHAR LIMIT=NONE] -->
+ <string name="screenrecord_save_error">Error saving screen recording</string>
<!-- A toast message shown when the screen recording cannot be started due to a generic error [CHAR LIMIT=NONE] -->
<string name="screenrecord_start_error">Error starting screen recording</string>
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
index 84f358c..e1ac0fd 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
@@ -453,9 +453,9 @@
postGroupNotification(currentUser);
mNotificationManager.notifyAsUser(null, mNotificationId, notification,
currentUser);
- } catch (IOException e) {
+ } catch (IOException | IllegalStateException e) {
Log.e(TAG, "Error saving screen recording: " + e.getMessage());
- showErrorToast(R.string.screenrecord_delete_error);
+ showErrorToast(R.string.screenrecord_save_error);
mNotificationManager.cancelAsUser(null, mNotificationId, currentUser);
}
});
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java
index b8d96f7..b80a01212 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java
@@ -52,8 +52,9 @@
import android.view.WindowManager;
import com.android.systemui.media.MediaProjectionCaptureTarget;
-import java.io.File;
+
import java.io.Closeable;
+import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
@@ -321,7 +322,7 @@
/**
* Store recorded video
*/
- protected SavedRecording save() throws IOException {
+ protected SavedRecording save() throws IOException, IllegalStateException {
String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")
.format(new Date());
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java
index 7ffcfd4..dc3310d 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java
@@ -52,9 +52,8 @@
/**
* RUN IN THE BACKGROUND THREAD!
*/
- public void mux() throws IOException {
- MediaMuxer muxer = null;
- muxer = new MediaMuxer(mOutFile, mFormat);
+ public void mux() throws IOException, IllegalStateException {
+ MediaMuxer muxer = new MediaMuxer(mOutFile, mFormat);
// Add extractors
for (String file: mFiles) {
MediaExtractor extractor = new MediaExtractor();
@@ -74,7 +73,10 @@
}
}
+ // This may throw IllegalStateException if no tracks were added above
+ // Let the error propagate up so we can notify the user.
muxer.start();
+
for (Pair<MediaExtractor, Integer> pair: mExtractorIndexToMuxerIndex.keySet()) {
MediaExtractor extractor = pair.first;
extractor.selectTrack(pair.second);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java
index 7c30843b..3def6ba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java
@@ -46,6 +46,8 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -73,6 +75,8 @@
private Handler mHandler;
@Mock
private UserContextProvider mUserContextTracker;
+ @Captor
+ private ArgumentCaptor<Runnable> mRunnableCaptor;
private KeyguardDismissUtil mKeyguardDismissUtil = new KeyguardDismissUtil() {
public void executeWhenUnlocked(ActivityStarter.OnDismissAction action,
boolean requiresShadeOpen) {
@@ -209,4 +213,19 @@
verify(mScreenMediaRecorder).release();
}
+
+ @Test
+ public void testOnErrorSaving() throws IOException {
+ // When the screen recording does not save properly
+ doThrow(new IllegalStateException("fail")).when(mScreenMediaRecorder).save();
+
+ Intent startIntent = RecordingService.getStopIntent(mContext);
+ mRecordingService.onStartCommand(startIntent, 0, 0);
+ verify(mExecutor).execute(mRunnableCaptor.capture());
+ mRunnableCaptor.getValue().run();
+
+ // Then the state is set to not recording and we cancel the notification
+ verify(mController).updateState(false);
+ verify(mNotificationManager).cancelAsUser(any(), anyInt(), any());
+ }
}