Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAndroidExitInfo.cpp
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: GPL-3.0-or-later
3 */
4#include "KisAndroidUtils.h"
6#include <QAndroidJniEnvironment>
7#include <QAndroidJniObject>
8#include <QtAndroid>
9
11{
12 QAndroidJniEnvironment env;
13 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative",
14 "activity",
15 "()Landroid/app/Activity;");
16 if (env->ExceptionCheck()) {
17 qWarning("KisAndroidExitInfo::getLast: JNI exception in activity");
18 env->ExceptionDescribe();
19 env->ExceptionClear();
20 return KisAndroidExitInfo();
21 } else if (!activity.isValid()) {
22 qWarning("KisAndroidExitInfo::getLast: activity not valid");
23 return KisAndroidExitInfo();
24 }
25
26 QAndroidJniObject exitInfo =
27 activity.callObjectMethod("getLastApplicationExitInfo", "()Landroid/app/ApplicationExitInfo;");
28 if (env->ExceptionCheck()) {
29 qWarning("KisAndroidExitInfo::getLast: JNI exception in getLastApplicationExitInfo");
30 env->ExceptionDescribe();
31 env->ExceptionClear();
32 return KisAndroidExitInfo();
33 } else if (!exitInfo.isValid()) {
34 qWarning("KisAndroidExitInfo::getLast: exit info not valid");
35 return KisAndroidExitInfo();
36 }
37
38 int reasonCode = exitInfo.callMethod<jint>("getReason", "()I");
39 if (env->ExceptionCheck()) {
40 qWarning("KisAndroidExitInfo::getLast: JNI exception in getReason");
41 env->ExceptionDescribe();
42 env->ExceptionClear();
43 return KisAndroidExitInfo();
44 }
45
46 int exitOrSignalCode = exitInfo.callMethod<jint>("getStatus", "()I");
47 if (env->ExceptionCheck()) {
48 qWarning("KisAndroidExitInfo::getLast: JNI exception in getStatus");
49 env->ExceptionDescribe();
50 env->ExceptionClear();
52 }
53
54 int importanceCode = exitInfo.callMethod<jint>("getImportance", "()I");
55 if (env->ExceptionCheck()) {
56 qWarning("KisAndroidExitInfo::getLast: JNI exception in getImportance");
57 env->ExceptionDescribe();
58 env->ExceptionClear();
59 importanceCode = -1;
60 }
61
62 QString description;
63 {
64 QAndroidJniObject descriptionObject = exitInfo.callObjectMethod("getDescription", "()Ljava/lang/String;");
65 if (env->ExceptionCheck()) {
66 qWarning("KisAndroidExitInfo::getLast: JNI exception in getDescription");
67 env->ExceptionDescribe();
68 env->ExceptionClear();
69 } else if (descriptionObject.isValid()) {
70 description = descriptionObject.toString();
71 }
72 }
73
75}
76
78 : m_reasonCode(int(Reason::Unknown))
79 , m_exitOrSignalCode(-1)
80 , m_importanceCode(-1)
81 , m_valid(false)
82{
83}
84
86 int exitOrSignalCode,
87 int importanceCode,
88 const QString &description)
89 : m_description(description)
90 , m_reasonCode(reasonCode)
91 , m_exitOrSignalCode(exitOrSignalCode)
92 , m_importanceCode(importanceCode)
93 , m_valid(true)
94{
95}
96
98{
99 if (!isValid()) {
100 return QString();
101 }
102
103 QString message;
104
105 message.append(QStringLiteral("reason %1").arg(m_reasonCode));
106 switch (m_reasonCode) {
107 case int(Reason::Unknown):
108 message.append(QStringLiteral(" (UNKNOWN)"));
109 break;
110 case int(Reason::ExitSelf):
111 message.append(QStringLiteral(" (EXIT_SELF)"));
112 break;
113 case int(Reason::Signaled):
114 message.append(QStringLiteral(" (SIGNALED)"));
115 break;
116 case int(Reason::LowMemory):
117 message.append(QStringLiteral(" (LOW_MEMORY)"));
118 break;
119 case int(Reason::Crash):
120 message.append(QStringLiteral(" (CRASH)"));
121 break;
122 case int(Reason::CrashNative):
123 message.append(QStringLiteral(" (CRASH_NATIVE)"));
124 break;
125 case int(Reason::Anr):
126 message.append(QStringLiteral(" (ANR)"));
127 break;
129 message.append(QStringLiteral(" (INITIALIZATION_FAILURE)"));
130 break;
131 case int(Reason::PermissionChange):
132 message.append(QStringLiteral(" (PERMISSION_CHANGE)"));
133 break;
135 message.append(QStringLiteral(" (EXCESSIVE_RESOURCE_USAGE)"));
136 break;
137 case int(Reason::UserRequested):
138 message.append(QStringLiteral(" (USER_REQUESTED)"));
139 break;
140 case int(Reason::UserStopped):
141 message.append(QStringLiteral(" (USER_STOPPED)"));
142 break;
143 case int(Reason::DependencyDied):
144 message.append(QStringLiteral(" (DEPENDENCY_DIED)"));
145 break;
146 case int(Reason::Other):
147 message.append(QStringLiteral(" (OTHER)"));
148 break;
149 case int(Reason::Freezer):
150 message.append(QStringLiteral(" (FREEZER)"));
151 break;
153 message.append(QStringLiteral(" (PACKAGE_STATE_CHANGE)"));
154 break;
155 case int(Reason::PackageUpdated):
156 message.append(QStringLiteral(" (PACKAGE_UPDATED)"));
157 break;
158 default:
159 break;
160 }
161
162 message.append(QStringLiteral(", importance %1").arg(m_importanceCode));
163 switch (m_importanceCode) {
164 case int(Importance::Foreground):
165 message.append(QStringLiteral(" (FOREGROUND)"));
166 break;
168 message.append(QStringLiteral(" (FOREGROUND_SERVICE)"));
169 break;
171 message.append(QStringLiteral(" (PERCEPTIBLE_PRE_26)"));
172 break;
174 message.append(QStringLiteral(" (TOP_SLEEPING_PRE_28)"));
175 break;
176 case int(Importance::Visible):
177 message.append(QStringLiteral(" (VISIBLE)"));
178 break;
179 case int(Importance::Perceptible):
180 message.append(QStringLiteral(" (PERCEPTIBLE)"));
181 break;
182 case int(Importance::Service):
183 message.append(QStringLiteral(" (SERVICE)"));
184 break;
185 case int(Importance::TopSleeping):
186 message.append(QStringLiteral(" (TOP_SLEEPING)"));
187 break;
189 message.append(QStringLiteral(" (CANT_SAVE_STATE)"));
190 break;
191 case int(Importance::Cached):
192 message.append(QStringLiteral(" (CACHED)"));
193 break;
194 case int(Importance::Empty):
195 message.append(QStringLiteral(" (EMPTY)"));
196 break;
197 case int(Importance::Gone):
198 message.append(QStringLiteral(" (GONE)"));
199 break;
200 default:
201 break;
202 }
203
204 message.append(QStringLiteral(", exit code/signal %1").arg(m_exitOrSignalCode));
205
206 message.append(QStringLiteral(", low-memory kill report "));
208 message.append(QStringLiteral("supported"));
209 } else {
210 message.append(QStringLiteral("not supported"));
211 }
212
213 if (m_description.isEmpty()) {
214 message.append(QStringLiteral(", no description"));
215 } else {
216 message.append(QStringLiteral(", description '%1'").arg(m_description));
217 }
218
219 return message;
220}
QString buildLogString() const
const QString & description() const
static KisAndroidExitInfo getLast()
const QString m_description
bool isLowMemoryKillReportSupported()
@ Unknown
Definition psd.h:44