From 9b942de47e1d67e0868467d384a448c192c9f406 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Thu, 10 Sep 2020 19:20:49 +1000 Subject: [PATCH] Android: Improve handling of portrait mode --- .../app/src/cpp/android_host_interface.cpp | 7 ++++++ android/app/src/main/AndroidManifest.xml | 3 ++- .../duckstation/AndroidHostInterface.java | 6 +++++ .../duckstation/EmulationActivity.java | 25 +++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp index 8c5e18936..36d07f637 100644 --- a/android/app/src/cpp/android_host_interface.cpp +++ b/android/app/src/cpp/android_host_interface.cpp @@ -723,3 +723,10 @@ DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_saveState, jobject obj, jboole AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); hi->RunOnEmulationThread([hi, global, slot]() { hi->SaveState(global, slot); }); } + +DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setDisplayAlignment, jobject obj, jint alignment) +{ + AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); + hi->RunOnEmulationThread([hi, alignment]() { hi->GetDisplay()->SetDisplayAlignment(static_cast(alignment)); }); +} + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index addabb317..4bcb3b9a2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -18,7 +18,8 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/title_activity_emulation" android:parentActivityName=".MainActivity" - android:theme="@style/FullscreenTheme"> + android:theme="@style/FullscreenTheme" + android:immersive="true"> diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java index 87313d2a5..f1376485d 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java @@ -9,6 +9,10 @@ import android.widget.Toast; import com.google.android.material.snackbar.Snackbar; public class AndroidHostInterface { + public final static int DISPLAY_ALIGNMENT_TOP_OR_LEFT = 0; + public final static int DISPLAY_ALIGNMENT_CENTER = 1; + public final static int DISPLAY_ALIGNMENT_RIGHT_OR_BOTTOM = 2; + private long mNativePointer; private Context mContext; @@ -57,6 +61,8 @@ public class AndroidHostInterface { public native void applySettings(); + public native void setDisplayAlignment(int alignment); + static { System.loadLibrary("duckstation-native"); } diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java index 66ba697f7..9dbb3f803 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java @@ -2,12 +2,14 @@ package com.github.stenzek.duckstation; import android.annotation.SuppressLint; +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.util.Log; @@ -102,6 +104,7 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde // Once we get a surface, we can boot. if (AndroidHostInterface.getInstance().isEmulationThreadRunning()) { AndroidHostInterface.getInstance().surfaceChanged(holder.getSurface(), format, width, height); + updateOrientation(); return; } @@ -110,6 +113,7 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde final String bootSaveStatePath = getIntent().getStringExtra("saveStatePath"); AndroidHostInterface.getInstance().startEmulationThread(this, holder.getSurface(), bootPath, resumeState, bootSaveStatePath); + updateOrientation(); } @Override @@ -227,6 +231,27 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde showSystemUI(); } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + updateOrientation(newConfig.orientation); + } + + private void updateOrientation() { + final int orientation = getResources().getConfiguration().orientation; + updateOrientation(orientation); + } + + private void updateOrientation(int newOrientation) { + if (!AndroidHostInterface.getInstance().isEmulationThreadRunning()) + return; + + if (newOrientation == Configuration.ORIENTATION_PORTRAIT) + AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_TOP_OR_LEFT); + else + AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_CENTER); + } + /** * Some older devices needs a small delay between UI widget updates * and a change of the status and navigation bar.