forked from geode-sdk/android-launcher
show message when game fails to load
This commit is contained in:
5 files changed
+133
-30
No files matched your search
@@ -50,31 +50,60 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
|
||||
// return back to main if Geometry Dash isn't found
|
||||
if (!LaunchUtils.isGeometryDashInstalled(packageManager)) {
|
||||
val launchIntent = Intent(this, MainActivity::class.java)
|
||||
launchIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
|
||||
startActivity(launchIntent)
|
||||
}
|
||||
|
||||
val gdPackageInfo = packageManager.getPackageInfo(Constants.PACKAGE_NAME, 0)
|
||||
|
||||
try {
|
||||
LaunchUtils.addAssetsFromPackage(assets, gdPackageInfo)
|
||||
} catch (e: NoSuchMethodException) {
|
||||
e.printStackTrace()
|
||||
returnToMain()
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// fixes bugs specific to the new app directory, such as package name
|
||||
val saveDir = LaunchUtils.getSaveDirectory(this)
|
||||
saveDir.mkdir()
|
||||
|
||||
LauncherFix.loadLibrary()
|
||||
LauncherFix.setOriginalDataPath(Constants.GJ_DATA_DIR)
|
||||
LauncherFix.setDataPath(saveDir.path)
|
||||
tryLoadGame()
|
||||
} catch (e: UnsatisfiedLinkError) {
|
||||
e.printStackTrace()
|
||||
|
||||
// generates helpful information for use in debugging library load failures
|
||||
val gdPackageInfo = packageManager.getPackageInfo(Constants.PACKAGE_NAME, 0)
|
||||
|
||||
val abi = LaunchUtils.applicationArchitecture
|
||||
val isExtracted = gdPackageInfo.applicationInfo.flags and ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS == ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS
|
||||
val isSplit = (gdPackageInfo.applicationInfo.splitSourceDirs?.size ?: 0) > 1
|
||||
|
||||
val metadata = "Geometry Dash metadata:\nSplit sources: $isSplit\nExtracted libraries: $isExtracted\nLauncher architecture: $abi"
|
||||
Log.i("GeodeLauncher", metadata)
|
||||
|
||||
returnToMain(
|
||||
getString(R.string.load_failed_link_error),
|
||||
getString(R.string.load_failed_link_error_description)
|
||||
)
|
||||
|
||||
return
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
|
||||
returnToMain(
|
||||
getString(R.string.load_failed_generic_error),
|
||||
getString(R.string.load_failed_generic_error_description, e.message ?: "UnknownException")
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private fun returnToMain(returnTitle: String? = null, returnMessage: String? = null) {
|
||||
val launchIntent = Intent(this, MainActivity::class.java).apply {
|
||||
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
|
||||
if (!returnTitle.isNullOrEmpty() && !returnMessage.isNullOrEmpty()) {
|
||||
putExtra(Constants.LAUNCHER_KEY_RETURN_TITLE, returnTitle)
|
||||
putExtra(Constants.LAUNCHER_KEY_RETURN_MESSAGE, returnMessage)
|
||||
}
|
||||
}
|
||||
|
||||
startActivity(launchIntent)
|
||||
}
|
||||
|
||||
private fun tryLoadGame() {
|
||||
val gdPackageInfo = packageManager.getPackageInfo(Constants.PACKAGE_NAME, 0)
|
||||
|
||||
setupRedirection(gdPackageInfo)
|
||||
|
||||
// request read and write permissions
|
||||
requestPermissions(
|
||||
@@ -95,25 +124,49 @@ class GeometryDashActivity : AppCompatActivity(), Cocos2dxHelper.Cocos2dxHelperL
|
||||
loadTestingLibraries()
|
||||
}
|
||||
|
||||
FMOD.init(this)
|
||||
|
||||
setContentView(createView())
|
||||
|
||||
// call native functions after native libraries init
|
||||
JniToCpp.setupHSSAssets(
|
||||
gdPackageInfo.applicationInfo.sourceDir,
|
||||
Environment.getExternalStorageDirectory().absolutePath
|
||||
)
|
||||
Cocos2dxHelper.nativeSetApkPath(gdPackageInfo.applicationInfo.sourceDir)
|
||||
|
||||
BaseRobTopActivity.setCurrentActivity(this)
|
||||
registerReceiver()
|
||||
setupPostLibraryLoad(gdPackageInfo)
|
||||
|
||||
if (!loadGeodeLibrary()) {
|
||||
Log.w("GeodeLauncher", "could not load Geode object!")
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupRedirection(packageInfo: PackageInfo) {
|
||||
try {
|
||||
LaunchUtils.addAssetsFromPackage(assets, packageInfo)
|
||||
} catch (e: NoSuchMethodException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
try {
|
||||
// fixes bugs specific to the new app directory, such as package name
|
||||
val saveDir = LaunchUtils.getSaveDirectory(this)
|
||||
saveDir.mkdir()
|
||||
|
||||
LauncherFix.loadLibrary()
|
||||
LauncherFix.setOriginalDataPath(Constants.GJ_DATA_DIR)
|
||||
LauncherFix.setDataPath(saveDir.path)
|
||||
} catch (e: UnsatisfiedLinkError) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupPostLibraryLoad(packageInfo: PackageInfo) {
|
||||
FMOD.init(this)
|
||||
|
||||
// call native functions after native libraries init
|
||||
JniToCpp.setupHSSAssets(
|
||||
packageInfo.applicationInfo.sourceDir,
|
||||
Environment.getExternalStorageDirectory().absolutePath
|
||||
)
|
||||
Cocos2dxHelper.nativeSetApkPath(packageInfo.applicationInfo.sourceDir)
|
||||
|
||||
BaseRobTopActivity.setCurrentActivity(this)
|
||||
registerReceiver()
|
||||
}
|
||||
|
||||
@SuppressLint("UnsafeDynamicallyLoadedCode")
|
||||
private fun tryLoadLibrary(packageInfo: PackageInfo, libraryName: String) {
|
||||
val nativeDir = getNativeLibraryDirectory(packageInfo.applicationInfo)
|
||||
|
||||
@@ -55,6 +55,9 @@ class MainActivity : ComponentActivity() {
|
||||
val gdInstalled = LaunchUtils.isGeometryDashInstalled(packageManager)
|
||||
val geodeInstalled = LaunchUtils.isGeodeInstalled(this)
|
||||
|
||||
val returnMessage = intent.extras?.getString(Constants.LAUNCHER_KEY_RETURN_MESSAGE)
|
||||
val returnTitle = intent.extras?.getString(Constants.LAUNCHER_KEY_RETURN_TITLE)
|
||||
|
||||
setContent {
|
||||
val themeOption by PreferenceUtils.useIntPreference(PreferenceUtils.Key.THEME)
|
||||
val theme = Theme.fromInt(themeOption)
|
||||
@@ -68,6 +71,10 @@ class MainActivity : ComponentActivity() {
|
||||
color = MaterialTheme.colorScheme.background
|
||||
) {
|
||||
MainScreen(gdInstalled, geodeInstalled)
|
||||
|
||||
if (!returnMessage.isNullOrEmpty() && !returnTitle.isNullOrEmpty()) {
|
||||
LoadFailedDialog(returnTitle, returnMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -146,6 +153,30 @@ fun UpdateMessageIndicator(
|
||||
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun LoadFailedDialog(returnTitle: String, returnMessage: String) {
|
||||
var showDialog by remember { mutableStateOf(true) }
|
||||
|
||||
if (showDialog) {
|
||||
AlertDialog(
|
||||
icon = {
|
||||
Icon(
|
||||
painterResource(R.drawable.icon_error),
|
||||
contentDescription = stringResource(R.string.launcher_error_icon_alt)
|
||||
)
|
||||
},
|
||||
title = { Text(returnTitle) },
|
||||
text = { Text(returnMessage) },
|
||||
confirmButton = {
|
||||
TextButton(onClick = { showDialog = false }) {
|
||||
Text(stringResource(R.string.message_box_accept))
|
||||
}
|
||||
},
|
||||
onDismissRequest = { showDialog = false }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun UpdateWarning() {
|
||||
val context = LocalContext.current
|
||||
|
||||
@@ -15,4 +15,8 @@ object Constants {
|
||||
|
||||
const val SUPPORTED_VERSION_CODE = 37L
|
||||
const val SUPPORTED_VERSION_STRING = "2.2.13"
|
||||
|
||||
const val LAUNCHER_KEY_RETURN_TITLE = "return_title"
|
||||
const val LAUNCHER_KEY_RETURN_MESSAGE = "return_message"
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M480,680Q497,680 508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM440,520L520,520L520,280L440,280L440,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
|
||||
</vector>
|
||||
@@ -19,6 +19,7 @@
|
||||
<item quantity="other">Automatically launching game in %1$d seconds.</item>
|
||||
</plurals>
|
||||
<string name="launcher_warning_icon_alt">warning</string>
|
||||
<string name="launcher_error_icon_alt">error</string>
|
||||
<string name="launcher_unsupported_version_title">Unsupported version</string>
|
||||
<string name="launcher_unsupported_version_description">
|
||||
The current version of Geometry Dash is not compatible with the version supported by the launcher (%2$s).\nLaunch will continue, but crashes may occur!
|
||||
@@ -38,6 +39,10 @@
|
||||
<string name="release_fetch_manual_check_required">Externally managed library in use, please manually check for updates if you want to overwrite it.</string>
|
||||
|
||||
<!-- GeometryDashActivity strings -->
|
||||
<string name="load_failed_link_error">Failed to link libraries</string>
|
||||
<string name="load_failed_link_error_description">Game libraries could not be found. This may occur if the architecture of the launcher and Geometry Dash do not match, or from a system bug.\nCheck application logs for more details. Please report this issue!</string>
|
||||
<string name="load_failed_generic_error">Load failed</string>
|
||||
<string name="load_failed_generic_error_description">Uncaught error during game load: `%1$s`.\nCheck application logs for more details. Please report this issue!</string>
|
||||
<string name="message_box_cancel">Cancel</string>
|
||||
<string name="message_box_accept">OK</string>
|
||||
|
||||
|
||||
Reference in new issue
Block a user