From d05eec7207093be9de578289eacc6bcc2fcdddd2 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <slouken@libsdl.org>
Date: Tue, 12 Mar 2019 14:44:25 -0700
Subject: [PATCH] Fixed initial display orientation at Android app start

---
 src/core/android/SDL_android.c       | 23 +++++++++++++----------
 src/core/android/SDL_android.h       |  6 ++++--
 src/video/android/SDL_androidvideo.c | 11 ++++++++---
 3 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index a88f2f2cf..cc7be09d2 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -284,6 +284,7 @@ static jmethodID midHapticStop;
 static jfieldID fidSeparateMouseAndTouch;
 
 /* Accelerometer data storage */
+static SDL_DisplayOrientation displayOrientation;
 static float fLastAccelerometer[3];
 static SDL_bool bHasNewData;
 
@@ -399,7 +400,7 @@ Android_JNI_ThreadDestroyed(void *value)
 
 /* Creation of local storage mThreadKey */
 static void
-Android_JNI_CreateKey()
+Android_JNI_CreateKey(void)
 {
     int status = pthread_key_create(&mThreadKey, Android_JNI_ThreadDestroyed);
     if (status < 0) {
@@ -408,7 +409,7 @@ Android_JNI_CreateKey()
 }
 
 static void
-Android_JNI_CreateKey_once()
+Android_JNI_CreateKey_once(void)
 {
     int status = pthread_once(&key_once, Android_JNI_CreateKey);
     if (status < 0) {
@@ -423,7 +424,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
     return JNI_VERSION_1_4;
 }
 
-void checkJNIReady()
+void checkJNIReady(void)
 {
     if (!mActivityClass || !mAudioManagerClass || !mControllerManagerClass) {
         /* We aren't fully initialized, let's just return. */
@@ -739,11 +740,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)(
 {
     SDL_LockMutex(Android_ActivityMutex);
 
-    if (Android_Window)
-    {
-        SDL_VideoDisplay *display = SDL_GetDisplay(0);
-        SDL_SendDisplayEvent(display, SDL_DISPLAYEVENT_ORIENTATION, orientation);
-    }
+    displayOrientation = (SDL_DisplayOrientation)orientation;
+    SDL_SendDisplayEvent(SDL_GetDisplay(0), SDL_DISPLAYEVENT_ORIENTATION, orientation);
 
     SDL_UnlockMutex(Android_ActivityMutex);
 }
@@ -1418,6 +1416,11 @@ int Android_JNI_OpenAudioDevice(int iscapture, SDL_AudioSpec *spec)
     return 0;
 }
 
+SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void)
+{
+    return displayOrientation;
+}
+
 int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi)
 {
     JNIEnv *env = Android_JNI_GetEnv();
@@ -2263,7 +2266,7 @@ void Android_JNI_HideTextInput(void)
     Android_JNI_SendMessage(COMMAND_TEXTEDIT_HIDE, 0);
 }
 
-SDL_bool Android_JNI_IsScreenKeyboardShown()
+SDL_bool Android_JNI_IsScreenKeyboardShown(void)
 {
     JNIEnv *env = Android_JNI_GetEnv();
     jboolean is_shown = 0;
@@ -2595,7 +2598,7 @@ SDL_bool Android_JNI_SetSystemCursor(int cursorID)
     return (*env)->CallStaticBooleanMethod(env, mActivityClass, midSetSystemCursor, cursorID);
 }
 
-SDL_bool Android_JNI_SupportsRelativeMouse()
+SDL_bool Android_JNI_SupportsRelativeMouse(void)
 {
     JNIEnv *env = Android_JNI_GetEnv();
     return (*env)->CallStaticBooleanMethod(env, mActivityClass, midSupportsRelativeMouse);
diff --git a/src/core/android/SDL_android.h b/src/core/android/SDL_android.h
index f437ab1ab..837378624 100644
--- a/src/core/android/SDL_android.h
+++ b/src/core/android/SDL_android.h
@@ -33,6 +33,7 @@ extern "C" {
 
 #include "SDL_audio.h"
 #include "SDL_rect.h"
+#include "SDL_video.h"
 
 /* Interface from the SDL library into the Android Java activity */
 extern void Android_JNI_SetActivityTitle(const char *title);
@@ -46,6 +47,7 @@ extern SDL_bool Android_JNI_IsScreenKeyboardShown(void);
 extern ANativeWindow* Android_JNI_GetNativeWindow(void);
 extern void Android_JNI_SetSurfaceViewFormat(int format);
 
+extern SDL_DisplayOrientation Android_JNI_GetDisplayOrientation(void);
 extern int Android_JNI_GetDisplayDPI(float *ddpi, float *xdpi, float *ydpi);
 
 /* Audio support */
@@ -58,8 +60,8 @@ extern void Android_JNI_CloseAudioDevice(const int iscapture);
 extern void Android_JNI_AudioSetThreadPriority(int iscapture, int device_id);
 
 /* Detecting device type */
-extern SDL_bool Android_IsDeXMode();
-extern SDL_bool Android_IsChromebook();
+extern SDL_bool Android_IsDeXMode(void);
+extern SDL_bool Android_IsChromebook(void);
 
 #include "SDL_rwops.h"
 
diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c
index 283b1053b..9ee60d718 100644
--- a/src/video/android/SDL_androidvideo.c
+++ b/src/video/android/SDL_androidvideo.c
@@ -172,8 +172,10 @@ VideoBootStrap Android_bootstrap = {
 int
 Android_VideoInit(_THIS)
 {
-    SDL_VideoData   *videodata = (SDL_VideoData *)_this->driverdata;
-    SDL_DisplayMode  mode;
+    SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
+    int display_index;
+    SDL_VideoDisplay *display;
+    SDL_DisplayMode mode;
 
     videodata->isPaused  = SDL_FALSE;
     videodata->isPausing = SDL_FALSE;
@@ -184,9 +186,12 @@ Android_VideoInit(_THIS)
     mode.refresh_rate    = Android_ScreenRate;
     mode.driverdata      = NULL;
 
-    if (SDL_AddBasicVideoDisplay(&mode) < 0) {
+    display_index = SDL_AddBasicVideoDisplay(&mode);
+    if (display_index < 0) {
         return -1;
     }
+    display = SDL_GetDisplay(display_index);
+    display->orientation = Android_JNI_GetDisplayOrientation();    
 
     SDL_AddDisplayMode(&_this->displays[0], &mode);