[camera] Fix the orientation of videos recorded in landscape on Android (#4946)

diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index cf50222..b864432 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.4+20
+
+* Fixes an issue with the orientation of videos recorded in landscape on Android.
+
 ## 0.9.4+19
 
 * Migrate deprecated Scaffold SnackBar methods to ScaffoldMessenger.
diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
index dd1e489..ec6fa13 100644
--- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
+++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
@@ -142,26 +142,32 @@
   }
 
   /**
-   * Returns the device's video orientation in degrees based on the sensor orientation and the last
-   * known UI orientation.
+   * Returns the device's video orientation in clockwise degrees based on the sensor orientation and
+   * the last known UI orientation.
    *
    * <p>Returns one of 0, 90, 180 or 270.
    *
-   * @return The device's video orientation in degrees.
+   * @return The device's video orientation in clockwise degrees.
    */
   public int getVideoOrientation() {
     return this.getVideoOrientation(this.lastOrientation);
   }
 
   /**
-   * Returns the device's video orientation in degrees based on the sensor orientation and the
-   * supplied {@link PlatformChannel.DeviceOrientation} value.
+   * Returns the device's video orientation in clockwise degrees based on the sensor orientation and
+   * the supplied {@link PlatformChannel.DeviceOrientation} value.
    *
    * <p>Returns one of 0, 90, 180 or 270.
    *
+   * <p>More details can be found in the official Android documentation:
+   * https://developer.android.com/reference/android/media/MediaRecorder#setOrientationHint(int)
+   *
+   * <p>See also:
+   * https://developer.android.com/training/camera2/camera-preview-large-screens#orientation_calculation
+   *
    * @param orientation The {@link PlatformChannel.DeviceOrientation} value that is to be converted
    *     into degrees.
-   * @return The device's video orientation in degrees.
+   * @return The device's video orientation in clockwise degrees.
    */
   public int getVideoOrientation(PlatformChannel.DeviceOrientation orientation) {
     int angle = 0;
@@ -179,10 +185,10 @@
         angle = 180;
         break;
       case LANDSCAPE_LEFT:
-        angle = 90;
+        angle = 270;
         break;
       case LANDSCAPE_RIGHT:
-        angle = 270;
+        angle = 90;
         break;
     }
 
diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
index 82449a1..3762006 100644
--- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
+++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
@@ -62,9 +62,9 @@
         deviceOrientationManager.getVideoOrientation(DeviceOrientation.LANDSCAPE_RIGHT);
 
     assertEquals(0, degreesPortraitUp);
-    assertEquals(90, degreesLandscapeLeft);
+    assertEquals(270, degreesLandscapeLeft);
     assertEquals(180, degreesPortraitDown);
-    assertEquals(270, degreesLandscapeRight);
+    assertEquals(90, degreesLandscapeRight);
   }
 
   @Test
@@ -81,18 +81,30 @@
         orientationManager.getVideoOrientation(DeviceOrientation.LANDSCAPE_RIGHT);
 
     assertEquals(90, degreesPortraitUp);
-    assertEquals(180, degreesLandscapeLeft);
+    assertEquals(0, degreesLandscapeLeft);
     assertEquals(270, degreesPortraitDown);
-    assertEquals(0, degreesLandscapeRight);
+    assertEquals(180, degreesLandscapeRight);
   }
 
   @Test
-  public void getVideoOrientation_shouldFallbackToSensorOrientationWhenOrientationIsNull() {
-    setUpUIOrientationMocks(Configuration.ORIENTATION_LANDSCAPE, Surface.ROTATION_0);
+  public void getVideoOrientation_fallbackToPortraitSensorOrientationWhenOrientationIsNull() {
+    setUpUIOrientationMocks(Configuration.ORIENTATION_PORTRAIT, Surface.ROTATION_0);
 
     int degrees = deviceOrientationManager.getVideoOrientation(null);
 
-    assertEquals(90, degrees);
+    assertEquals(0, degrees);
+  }
+
+  @Test
+  public void getVideoOrientation_fallbackToLandscapeSensorOrientationWhenOrientationIsNull() {
+    setUpUIOrientationMocks(Configuration.ORIENTATION_LANDSCAPE, Surface.ROTATION_0);
+
+    DeviceOrientationManager orientationManager =
+        DeviceOrientationManager.create(mockActivity, mockDartMessenger, false, 90);
+
+    int degrees = orientationManager.getVideoOrientation(null);
+
+    assertEquals(0, degrees);
   }
 
   @Test
diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml
index 2533583..feb83f9 100644
--- a/packages/camera/camera/pubspec.yaml
+++ b/packages/camera/camera/pubspec.yaml
@@ -4,7 +4,7 @@
   Dart.
 repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.9.4+19
+version: 0.9.4+20
 
 environment:
   sdk: ">=2.14.0 <3.0.0"