From a90b0daebef51dfa7ac2a4c5df49133ac4f98613 Mon Sep 17 00:00:00 2001
From: Ian Chamberlain <ian.h.chamberlain@gmail.com>
Date: Sat, 20 Aug 2022 20:35:45 -0400
Subject: [PATCH 1/7] Look at version_major.h when for newer ffmpeg libs

In ffmpeg 5.1, it seems most (or all) of these libraries use a separate
version_major.h, so the logic to check minimum version didn't work
without looking at the major version file.
---
 externals/cmake-modules/FindFFmpeg.cmake | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/externals/cmake-modules/FindFFmpeg.cmake b/externals/cmake-modules/FindFFmpeg.cmake
index 6cb5960bb..cac21c614 100644
--- a/externals/cmake-modules/FindFFmpeg.cmake
+++ b/externals/cmake-modules/FindFFmpeg.cmake
@@ -116,6 +116,10 @@ function(find_ffmpeg LIBNAME)
     endforeach()
     string(TOUPPER ${LIBNAME} LIBNAME_UPPER)
     file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version.h" _FFmpeg_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_(MAJOR|MINOR|MICRO) ")
+    if (EXISTS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h")
+      file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h" _FFmpeg_MAJOR_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_MAJOR ")
+      string(APPEND _FFmpeg_VERSION_H_CONTENTS "\n" ${_FFmpeg_MAJOR_VERSION_H_CONTENTS})
+    endif()
     set(_FFmpeg_VERSION_REGEX "([0-9]+)")
     foreach(v MAJOR MINOR MICRO)
       if("${_FFmpeg_VERSION_H_CONTENTS}" MATCHES "#define LIB${LIBNAME_UPPER}_VERSION_${v}[\\t ]+${_FFmpeg_VERSION_REGEX}")

From c634c263db5b1f7e5cffb7d1beb3ba07960b621b Mon Sep 17 00:00:00 2001
From: Ian Chamberlain <ian.h.chamberlain@gmail.com>
Date: Sat, 20 Aug 2022 20:49:59 -0400
Subject: [PATCH 2/7] citra-sdl: use the result of system.RunLoop()

If a shutdown was requested by the application, close the SDL window,
initiating the normal shutdown procedure. This causes a graceful exit
process instead of hanging.
---
 src/citra/citra.cpp                      | 14 +++++++++++++-
 src/citra/emu_window/emu_window_sdl2.cpp |  6 +++++-
 src/citra/emu_window/emu_window_sdl2.h   |  3 +++
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index a9b0b3eca..9e46fa9d9 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -391,6 +391,8 @@ int main(int argc, char** argv) {
         return -1;
     case Core::System::ResultStatus::Success:
         break; // Expected case
+    default:
+        LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails());
     }
 
     system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL");
@@ -437,7 +439,17 @@ int main(int argc, char** argv) {
         });
 
     while (emu_window->IsOpen()) {
-        system.RunLoop();
+        const auto result = system.RunLoop();
+
+        switch (result) {
+        case Core::System::ResultStatus::ShutdownRequested:
+            emu_window->Close();
+            break;
+        case Core::System::ResultStatus::Success:
+            break;
+        default:
+            LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails());
+        }
     }
     render_thread.join();
 
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp
index e5a0594c4..30206486b 100644
--- a/src/citra/emu_window/emu_window_sdl2.cpp
+++ b/src/citra/emu_window/emu_window_sdl2.cpp
@@ -104,6 +104,10 @@ bool EmuWindow_SDL2::IsOpen() const {
     return is_open;
 }
 
+void EmuWindow_SDL2::Close() {
+    is_open = false;
+}
+
 void EmuWindow_SDL2::OnResize() {
     int width, height;
     SDL_GetWindowSize(render_window, &width, &height);
@@ -134,7 +138,7 @@ void EmuWindow_SDL2::Fullscreen() {
 EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) {
     // Initialize the window
     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0) {
-        LOG_CRITICAL(Frontend, "Failed to initialize SDL2! Exiting...");
+        LOG_CRITICAL(Frontend, "Failed to initialize SDL2: {}! Exiting...", SDL_GetError());
         exit(1);
     }
 
diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h
index 64dec5381..831837ea6 100644
--- a/src/citra/emu_window/emu_window_sdl2.h
+++ b/src/citra/emu_window/emu_window_sdl2.h
@@ -46,6 +46,9 @@ public:
     /// Whether the window is still open, and a close request hasn't yet been sent
     bool IsOpen() const;
 
+    /// Close the window.
+    void Close();
+
     /// Creates a new context that is shared with the current context
     std::unique_ptr<GraphicsContext> CreateSharedContext() const override;
 

From ec7dc8803f195cc4d35545d588a8d57e929c93c0 Mon Sep 17 00:00:00 2001
From: Daisouji <82060898+Daisouji@users.noreply.github.com>
Date: Mon, 22 Aug 2022 11:18:55 -0400
Subject: [PATCH 3/7] GUI: Make touchscreen more visible in Midnight theme
 (#6100)

---
 dist/qt_themes/qdarkstyle_midnight_blue/style.qss | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss
index 794f09b96..c200819c5 100644
--- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss
+++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss
@@ -2158,6 +2158,10 @@ PlotWidget {
   padding: 0px;
 }
 
+TouchScreenPreview {
+  qproperty-dotHighlightColor: #3daee9;
+  background-color: #0f1922;
+}
 
 QListWidget#selectorList {
   background-color: #0f1922;
@@ -2168,4 +2172,4 @@ QLineEdit,
 QTreeView#hotkey_list,
 QScrollArea#scrollArea QTreeView {
   background-color: #0f1922;
-}
\ No newline at end of file
+}

From 401336c5e789f117411e94e9870a5b687e8bc0eb Mon Sep 17 00:00:00 2001
From: Ian Chamberlain <ian.h.chamberlain@gmail.com>
Date: Mon, 22 Aug 2022 18:10:47 -0400
Subject: [PATCH 4/7] Rename Close() -> RequestClose()

---
 src/citra/citra.cpp                      | 2 +-
 src/citra/emu_window/emu_window_sdl2.cpp | 6 +++---
 src/citra/emu_window/emu_window_sdl2.h   | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index 9e46fa9d9..6f8c16e2f 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -443,7 +443,7 @@ int main(int argc, char** argv) {
 
         switch (result) {
         case Core::System::ResultStatus::ShutdownRequested:
-            emu_window->Close();
+            emu_window->RequestClose();
             break;
         case Core::System::ResultStatus::Success:
             break;
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp
index 30206486b..08b36bf61 100644
--- a/src/citra/emu_window/emu_window_sdl2.cpp
+++ b/src/citra/emu_window/emu_window_sdl2.cpp
@@ -104,7 +104,7 @@ bool EmuWindow_SDL2::IsOpen() const {
     return is_open;
 }
 
-void EmuWindow_SDL2::Close() {
+void EmuWindow_SDL2::RequestClose() {
     is_open = false;
 }
 
@@ -260,7 +260,7 @@ void EmuWindow_SDL2::PollEvents() {
                 OnResize();
                 break;
             case SDL_WINDOWEVENT_CLOSE:
-                is_open = false;
+                RequestClose();
                 break;
             }
             break;
@@ -291,7 +291,7 @@ void EmuWindow_SDL2::PollEvents() {
             OnFingerUp();
             break;
         case SDL_QUIT:
-            is_open = false;
+            RequestClose();
             break;
         default:
             break;
diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h
index 831837ea6..27a0f0787 100644
--- a/src/citra/emu_window/emu_window_sdl2.h
+++ b/src/citra/emu_window/emu_window_sdl2.h
@@ -47,7 +47,7 @@ public:
     bool IsOpen() const;
 
     /// Close the window.
-    void Close();
+    void RequestClose();
 
     /// Creates a new context that is shared with the current context
     std::unique_ptr<GraphicsContext> CreateSharedContext() const override;

From 24b54a9b010e1183a413c9e24ee683bec8e9249e Mon Sep 17 00:00:00 2001
From: Ian Chamberlain <ian.h.chamberlain@gmail.com>
Date: Tue, 23 Aug 2022 08:22:17 -0400
Subject: [PATCH 5/7] Follow convention and break in default case

---
 src/citra/citra.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index 6f8c16e2f..cf3d51869 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -393,6 +393,7 @@ int main(int argc, char** argv) {
         break; // Expected case
     default:
         LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails());
+        break;
     }
 
     system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL");
@@ -449,6 +450,7 @@ int main(int argc, char** argv) {
             break;
         default:
             LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails());
+            break;
         }
     }
     render_thread.join();

From ddc802d2b4023324d3d5d1f896417d800034fef5 Mon Sep 17 00:00:00 2001
From: SachinVin <sachinvinayak2000@gmail.com>
Date: Sat, 13 Aug 2022 21:22:15 +0530
Subject: [PATCH 6/7] android: add canary and nightly flavours + fix git
 version tags

---
 .ci/android/build.sh         |  7 +++++--
 .ci/android/upload.sh        |  7 +++++--
 src/android/app/build.gradle | 16 ++++++++++++++++
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/.ci/android/build.sh b/.ci/android/build.sh
index 3c1e2f240..727f855d3 100755
--- a/.ci/android/build.sh
+++ b/.ci/android/build.sh
@@ -1,12 +1,15 @@
 #!/bin/bash -ex
 
 export NDK_CCACHE=$(which ccache)
+[ "$GITHUB_REPOSITORY" = "citra-emu/citra-canary" ] &&
+   BUILD_FLAVOR=canary ||
+   BUILD_FLAVOR=nightly
 
 ccache -s
 
 cd src/android
 chmod +x ./gradlew
-./gradlew bundleRelease
-./gradlew assembleRelease
+./gradlew assemble${BUILD_FLAVOR}Release
+./gradlew bundle${BUILD_FLAVOR}Release
 
 ccache -s
diff --git a/.ci/android/upload.sh b/.ci/android/upload.sh
index 64258dfd5..e395e5b4c 100755
--- a/.ci/android/upload.sh
+++ b/.ci/android/upload.sh
@@ -3,8 +3,11 @@
 . ./.ci/common/pre-upload.sh
 
 REV_NAME="citra-${GITDATE}-${GITREV}"
+[ "${GITHUB_REPOSITORY}" = "citra-emu/citra-canary" ] &&
+   BUILD_FLAVOR=canary ||
+   BUILD_FLAVOR=nightly
 
-cp src/android/app/build/outputs/apk/release/app-release.apk \
+cp src/android/app/build/outputs/apk/${BUILD_FLAVOR}/release/app-${BUILD_FLAVOR}-release.apk \
   "artifacts/${REV_NAME}.apk"
-cp src/android/app/build/outputs/bundle/release/app-release.aab \
+cp src/android/app/build/outputs/bundle/${BUILD_FLAVOR}Release/app-${BUILD_FLAVOR}-release.aab \
   "artifacts/${REV_NAME}.aab"
diff --git a/src/android/app/build.gradle b/src/android/app/build.gradle
index 1e70d8d99..a3ea30ffb 100644
--- a/src/android/app/build.gradle
+++ b/src/android/app/build.gradle
@@ -83,6 +83,17 @@ android {
         }
     }
 
+    flavorDimensions "version"
+    productFlavors {
+        canary {
+            dimension "version"
+            applicationIdSuffix ".canary"
+        }
+        nightly {
+            dimension "version"
+        }
+    }
+
     externalNativeBuild {
         cmake {
             version "3.18.1"
@@ -140,5 +151,10 @@ def getVersion() {
         logger.error('Cannot find git, defaulting to dummy version number')
     }
 
+    if (System.getenv("GITHUB_ACTIONS") != null) {
+        def gitTag = System.getenv("GIT_TAG_NAME")
+        versionName = gitTag ?: versionName
+    }
+
     return versionName
 }

From b52ae4388b1208e797f56c1c602f3dc6c7f1adef Mon Sep 17 00:00:00 2001
From: SachinVin <sachinvinayak2000@gmail.com>
Date: Wed, 24 Aug 2022 22:12:21 +0530
Subject: [PATCH 7/7] CI: android: Sign and publish apk

---
 .ci/android/upload.sh    | 10 ++++++++++
 .github/workflows/ci.yml | 12 ++++++++----
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/.ci/android/upload.sh b/.ci/android/upload.sh
index e395e5b4c..1b777d069 100755
--- a/.ci/android/upload.sh
+++ b/.ci/android/upload.sh
@@ -11,3 +11,13 @@ cp src/android/app/build/outputs/apk/${BUILD_FLAVOR}/release/app-${BUILD_FLAVOR}
   "artifacts/${REV_NAME}.apk"
 cp src/android/app/build/outputs/bundle/${BUILD_FLAVOR}Release/app-${BUILD_FLAVOR}-release.aab \
   "artifacts/${REV_NAME}.aab"
+
+if [ ! -z "${ANDROID_KEYSTORE_B64}" ]
+then
+  echo "Signing apk..."
+  base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > ks.jks
+
+  java -jar $(which apksigner) sign --ks ks.jks \
+    --ks-key-alias "${ANDROID_KEY_ALIAS}" \
+    --ks-pass env:ANDROID_KEYSTORE_PASS "artifacts/${REV_NAME}.apk"
+fi
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3203e62bf..c08acff38 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -129,10 +129,14 @@ jobs:
       - name: Deps
         run: |
           sudo apt-get update
-          sudo apt-get install ccache -y
+          sudo apt-get install ccache apksigner -y
       - name: Build
         run: ./.ci/android/build.sh
-      - name: Copy artifacts
+      - name: Copy and sign artifacts
+        env:
+          ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
+          ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
+          ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
         run: ./.ci/android/upload.sh
       - name: Upload
         uses: actions/upload-artifact@v3
@@ -153,7 +157,7 @@ jobs:
           TRANSIFEX_API_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }}
   release:
     runs-on: ubuntu-latest
-    needs: [build, macos]
+    needs: [build, macos, android]
     if: ${{ startsWith(github.ref, 'refs/tags/') }}
     steps:
       - uses: actions/download-artifact@v3
@@ -174,4 +178,4 @@ jobs:
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
-          asset_paths: '["./**/*.tar.*","./**/*.7z","./**/*.zip"]'
+          asset_paths: '["./**/*.tar.*","./**/*.7z","./**/*.zip","./**/*.apk","./**/*.aab"]'