1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Fixed an issue maintaining kiosk mode on Android

This commit is contained in:
Tom Poole 2019-07-07 14:02:01 +01:00
parent de13b83ed2
commit 29508fac70
2 changed files with 61 additions and 33 deletions

View file

@ -523,22 +523,23 @@ DECLARE_JNI_CLASS (AndroidUri, "android/net/Uri")
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
METHOD (construct, "<init>", "(Landroid/content/Context;)V") \
METHOD (layout, "layout", "(IIII)V") \
METHOD (getLeft, "getLeft", "()I") \
METHOD (getTop, "getTop", "()I") \
METHOD (getWidth, "getWidth", "()I") \
METHOD (getHeight, "getHeight", "()I") \
METHOD (getLocationOnScreen, "getLocationOnScreen", "([I)V") \
METHOD (getParent, "getParent", "()Landroid/view/ViewParent;") \
METHOD (bringToFront, "bringToFront", "()V") \
METHOD (requestFocus, "requestFocus", "()Z") \
METHOD (hasFocus, "hasFocus", "()Z") \
METHOD (invalidate, "invalidate", "(IIII)V") \
METHOD (setVisibility, "setVisibility", "(I)V") \
METHOD (setLayoutParams, "setLayoutParams", "(Landroid/view/ViewGroup$LayoutParams;)V") \
METHOD (findViewById, "findViewById", "(I)Landroid/view/View;") \
METHOD (getRootView, "getRootView", "()Landroid/view/View;") \
METHOD (construct, "<init>", "(Landroid/content/Context;)V") \
METHOD (layout, "layout", "(IIII)V") \
METHOD (getLeft, "getLeft", "()I") \
METHOD (getTop, "getTop", "()I") \
METHOD (getWidth, "getWidth", "()I") \
METHOD (getHeight, "getHeight", "()I") \
METHOD (getLocationOnScreen, "getLocationOnScreen", "([I)V") \
METHOD (getParent, "getParent", "()Landroid/view/ViewParent;") \
METHOD (bringToFront, "bringToFront", "()V") \
METHOD (requestFocus, "requestFocus", "()Z") \
METHOD (hasFocus, "hasFocus", "()Z") \
METHOD (invalidate, "invalidate", "(IIII)V") \
METHOD (setVisibility, "setVisibility", "(I)V") \
METHOD (setLayoutParams, "setLayoutParams", "(Landroid/view/ViewGroup$LayoutParams;)V") \
METHOD (setSystemUiVisibility, "setSystemUiVisibility", "(I)V") \
METHOD (findViewById, "findViewById", "(I)Landroid/view/View;") \
METHOD (getRootView, "getRootView", "()Landroid/view/View;") \
METHOD (addOnLayoutChangeListener, "addOnLayoutChangeListener", "(Landroid/view/View$OnLayoutChangeListener;)V")
DECLARE_JNI_CLASS (AndroidView, "android/view/View")

View file

@ -230,11 +230,30 @@ DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
METHOD (getDecorView, "getDecorView", "()Landroid/view/View;") \
METHOD (setFlags, "setFlags", "(II)V")
METHOD (setFlags, "setFlags", "(II)V") \
METHOD (clearFlags, "clearFlags", "(I)V")
DECLARE_JNI_CLASS (AndroidWindow, "android/view/Window")
#undef JNI_CLASS_MEMBERS
namespace
{
enum
{
SYSTEM_UI_FLAG_VISIBLE = 0,
SYSTEM_UI_FLAG_LOW_PROFILE = 1,
SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2,
SYSTEM_UI_FLAG_FULLSCREEN = 4,
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512,
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024,
SYSTEM_UI_FLAG_IMMERSIVE = 2048,
SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096
};
constexpr int fullScreenFlags = SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
constexpr int FLAG_NOT_FOCUSABLE = 0x8;
}
//==============================================================================
class AndroidComponentPeer : public ComponentPeer,
@ -300,11 +319,14 @@ public:
LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
physicalBounds.getWidth(), physicalBounds.getHeight(),
physicalBounds.getX(), physicalBounds.getY(),
TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS,
TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE,
component.isOpaque() ? PIXEL_FORMAT_OPAQUE : PIXEL_FORMAT_TRANSPARENT));
env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.gravity, GRAVITY_LEFT | GRAVITY_TOP);
env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.windowAnimations, 0x01030000 /* android.R.style.Animation */);
if (Desktop::getInstance().getKioskModeComponent() != nullptr)
setNavBarsHidden (true);
LocalRef<jobject> activity (getCurrentActivity());
if (activity == nullptr)
@ -509,20 +531,8 @@ public:
void setNavBarsHidden (bool hidden)
{
enum
{
SYSTEM_UI_FLAG_VISIBLE = 0,
SYSTEM_UI_FLAG_LOW_PROFILE = 1,
SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2,
SYSTEM_UI_FLAG_FULLSCREEN = 4,
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512,
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024,
SYSTEM_UI_FLAG_IMMERSIVE = 2048,
SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096
};
view.callVoidMethod (ComponentPeerView.setSystemUiVisibilityCompat,
hidden ? (jint) (SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
hidden ? (jint) (fullScreenFlags)
: (jint) (SYSTEM_UI_FLAG_VISIBLE));
navBarsHidden = hidden;
@ -533,7 +543,7 @@ public:
// updating the nav bar visibility is a bit odd on Android - need to wait for
if (shouldNavBarsBeHidden (shouldBeFullScreen))
{
if (! navBarsHidden && ! isTimerRunning())
if (! isTimerRunning())
{
startTimer (500);
}
@ -706,6 +716,9 @@ public:
void handleFocusChangeCallback (bool hasFocus)
{
if (isFullScreen())
setFullScreen (true);
if (hasFocus)
handleFocusGain();
else
@ -1099,7 +1112,8 @@ JUCE_API void JUCE_CALLTYPE Process::makeForegroundProcess() {}
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
METHOD (show, "show", "()V")
METHOD (show, "show", "()V") \
METHOD (getWindow, "getWindow", "()Landroid/view/Window;")
DECLARE_JNI_CLASS (AndroidDialog, "android/app/Dialog")
#undef JNI_CLASS_MEMBERS
@ -1206,7 +1220,20 @@ static void createAndroidDialog (const String& title, const String& message,
"android/content/DialogInterface$OnClickListener").get()));
LocalRef<jobject> dialog (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.create));
LocalRef<jobject> window (env->CallObjectMethod (dialog.get(), AndroidDialog.getWindow));
if (Desktop::getInstance().getKioskModeComponent() != nullptr)
{
env->CallVoidMethod (window.get(), AndroidWindow.setFlags, FLAG_NOT_FOCUSABLE, FLAG_NOT_FOCUSABLE);
LocalRef<jobject> decorView (env->CallObjectMethod (window.get(), AndroidWindow.getDecorView));
env->CallVoidMethod (decorView.get(), AndroidView.setSystemUiVisibility, fullScreenFlags);
}
env->CallVoidMethod (dialog.get(), AndroidDialog.show);
if (Desktop::getInstance().getKioskModeComponent() != nullptr)
env->CallVoidMethod (window.get(), AndroidWindow.clearFlags, FLAG_NOT_FOCUSABLE);
}
void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (AlertWindow::AlertIconType /*iconType*/,