Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
QtActivityDelegateBase.java
Go to the documentation of this file.
1// Copyright (C) 2017 BogDan Vatra <bogdan@kde.org>
2// Copyright (C) 2023 The Qt Company Ltd.
3// Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com>
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6package org.qtproject.qt.android;
7
8import android.animation.ValueAnimator;
9import android.app.Activity;
10import android.app.UiModeManager;
11import android.content.pm.ActivityInfo;
12import android.content.pm.PackageManager;
13import android.content.res.Configuration;
14import android.content.res.Resources;
15import android.graphics.Color;
16import android.os.Build;
17import android.view.Window;
18import android.view.WindowInsetsController;
19
20import java.util.HashMap;
21
22abstract class QtActivityDelegateBase
23{
24 protected final Activity m_activity;
25 protected final HashMap<Integer, QtWindow> m_topLevelWindows = new HashMap<>();
26 protected final QtDisplayManager m_displayManager;
27 protected final QtInputDelegate m_inputDelegate;
28 protected final QtAccessibilityDelegate m_accessibilityDelegate;
29
30 private boolean m_membersInitialized = false;
31 private boolean m_contextMenuVisible = false;
32
33 static native boolean canOverrideColorSchemeHint();
34 static native void updateUiContrast(float newUiContrast);
35 static native void updateUiMotionScale(float newUiMotionScale);
36
37 // Subclass must implement these
38 abstract void startNativeApplicationImpl(String appParams, String mainLib);
39
40 // With these we are okay with default implementation doing nothing
41 void setUpLayout() {}
42 void setUpSplashScreen(int orientation) {}
43 void hideSplashScreen(final int duration) {}
44 void setActionBarVisibility(boolean visible) {}
45
46 QtActivityDelegateBase(Activity activity)
47 {
48 m_activity = activity;
49 QtNative.setActivity(m_activity);
50 m_displayManager = new QtDisplayManager(m_activity);
51 m_inputDelegate = new QtInputDelegate(() -> {
52 QtWindowInsetsController.restoreFullScreenVisibility(m_activity);
53 });
54 m_accessibilityDelegate = new QtAccessibilityDelegate();
55 }
56
57 QtDisplayManager displayManager() {
58 return m_displayManager;
59 }
60
61 QtInputDelegate getInputDelegate() {
62 return m_inputDelegate;
63 }
64
65 void setContextMenuVisible(boolean contextMenuVisible)
66 {
67 m_contextMenuVisible = contextMenuVisible;
68 }
69
70 boolean isContextMenuVisible()
71 {
72 return m_contextMenuVisible;
73 }
74
75 void startNativeApplication(String appParams, String mainLib)
76 {
77 if (m_membersInitialized)
78 return;
79 initMembers();
80 startNativeApplicationImpl(appParams, mainLib);
81 }
82
83 void initMembers()
84 {
85 m_membersInitialized = true;
86 m_topLevelWindows.clear();
87 m_displayManager.registerDisplayListener();
88 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
89 ValueAnimator.registerDurationScaleChangeListener(
90 QtActivityDelegateBase::updateUiMotionScale);
91 updateUiMotionScale(ValueAnimator.getDurationScale());
92 }
93 m_inputDelegate.initInputMethodManager(m_activity);
94
95 try {
96 PackageManager pm = m_activity.getPackageManager();
97 ActivityInfo activityInfo = pm.getActivityInfo(m_activity.getComponentName(), 0);
98 m_inputDelegate.setSoftInputMode(activityInfo.softInputMode);
99 } catch (PackageManager.NameNotFoundException e) {
100 e.printStackTrace();
101 }
102
103 setUpLayout();
104 }
105
106 void hideSplashScreen()
107 {
108 hideSplashScreen(0);
109 }
110
111 void handleUiModeChange()
112 {
113 Resources resources = m_activity.getResources();
114 Configuration config = resources.getConfiguration();
115 int uiMode = config.uiMode & Configuration.UI_MODE_NIGHT_MASK;
116
117 if (QtWindowInsetsController.decorFitsSystemWindows(m_activity)) {
118 Window window = m_activity.getWindow();
119 QtWindowInsetsController.enableSystemBarsBackgroundDrawing(window);
120 int status = QtWindowInsetsController.getThemeDefaultStatusBarColor(m_activity);
121 QtWindowInsetsController.setStatusBarColor(window, status);
122 int nav = QtWindowInsetsController.getThemeDefaultNavigationBarColor(m_activity);
123 QtWindowInsetsController.setNavigationBarColor(window, nav);
124 }
125
126 // Don't override color scheme if the app has it set explicitly.
127 if (canOverrideColorSchemeHint()) {
128 boolean isLight = uiMode == Configuration.UI_MODE_NIGHT_NO;
129 QtWindowInsetsController.setStatusBarColorHint(m_activity, isLight);
130 QtWindowInsetsController.setNavigationBarColorHint(m_activity, isLight);
131 }
132
133 switch (uiMode) {
134 case Configuration.UI_MODE_NIGHT_NO:
135 ExtractStyle.runIfNeeded(m_activity, false);
136 QtDisplayManager.handleUiDarkModeChanged(0);
137 break;
138 case Configuration.UI_MODE_NIGHT_YES:
139 ExtractStyle.runIfNeeded(m_activity, true);
140 QtDisplayManager.handleUiDarkModeChanged(1);
141 break;
142 }
143
144 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
145 // FIXME: Handle contrast changes the same way as uiMode changes (QTBUG-140749).
146 UiModeManager uiModeManager =
147 (UiModeManager) m_activity.getSystemService(m_activity.UI_MODE_SERVICE);
148 updateUiContrast(uiModeManager.getContrast());
149 }
150 }
151}
Q_CORE_EXPORT QtJniTypes::Activity activity()
self window
[2]
EGLConfig config
[3]